开发有时需要动态创建表,创建完成后需要动态选择model对应的表,该需求如何实现

1、model层   TestBlock为了动态创建表、getBlockModel为了动态选择表

from django.db import models

# Create your models here.
class TestBlock(models.Model):
BLOCK_ID = models.CharField(max_length=40,primary_key=True, verbose_name='对象ID')
BLOCK_NAME = models.CharField(max_length=200, verbose_name='姓名')
class Meta:
db_table = 'TEST_BLOCK_T' def getBlockModel(table_name):
class MyCLass(models.Model):
BLOCK_ID = models.CharField(max_length=40, primary_key=True, verbose_name='对象ID')
BLOCK_NAME = models.CharField(max_length=200, verbose_name='姓名')
class Meta:
db_table = table_name
return MyCLass

2、url

from django.urls import path

from . import views

urlpatterns = [
path('autoCreate', views.createTest),
path('autoSelect', views.selectTest),
]

3、view层createTest方法  重点的地方 注意红色地方,注释掉可以动态创建表,但是如果不注释掉,动态变更实体对应的数据表在使用它,就会报错

ERROR:django.db.utils.OperationalError: (1054, "Unknown column 'TEST_BLOCK_T_1.BLOCK_ID' in 'where clause'")

分别注释 #-------------1-begin-------------------------- 和 # -------------2-begin--------------------------之间的代码,执行代码动态创建两个表并把数据插入进去。

from django.shortcuts import render

# Create your views here.
from .models import *
from django.http import HttpResponse
from django.db import connection from django.db.backends.base.schema import BaseDatabaseSchemaEditor def createTest(request):
#-------------1-begin--------------------------
TestBlock._meta.db_table = 'TEST_BLOCK_T_' + '1'
# #创建分表
cursor = connection.cursor()
editor = BaseDatabaseSchemaEditor(connection)
with BaseDatabaseSchemaEditor(connection) as editor:
editor.create_model(model=TestBlock)
# testBlock = TestBlock()
# testBlock.BLOCK_ID = '1'
# testBlock.BLOCK_NAME = 'oracle'
# testBlock.save()
# -------------1-end-------------------------- # -------------2-begin--------------------------
TestBlock._meta.db_table = 'TEST_BLOCK_T_' + '2'
# #创建分表
cursor = connection.cursor()
editor = BaseDatabaseSchemaEditor(connection)
with BaseDatabaseSchemaEditor(connection) as editor:
editor.create_model(model=TestBlock) # testBlock1 = TestBlock()
# testBlock1.BLOCK_ID = '2'
# testBlock1.BLOCK_NAME = 'mysql'
# testBlock1.save()
# -------------2-end--------------------------
return HttpResponse("yc is a good man")

4、view层selectTest方法  动态选择实体对应的表

def selectTest(request):
TestBlock = getBlockModel('TEST_BLOCK_T_' + '1')
testBlocks = TestBlock.objects.all()
for testBlock in testBlocks:
print('1---testBlock.BLOCK_ID:'+testBlock.BLOCK_ID)
print('1---testBlock.BLOCK_NAME:'+testBlock.BLOCK_NAME) TestBlock = getBlockModel('TEST_BLOCK_T_' + '2')
testBlocks = TestBlock.objects.all()
for testBlock in testBlocks:
print('2---testBlock.BLOCK_ID:'+testBlock.BLOCK_ID)
print('2---testBlock.BLOCK_NAME:'+testBlock.BLOCK_NAME)
return HttpResponse("yc is a good man")

数据结果:

1---testBlock.BLOCK_ID:1
1---testBlock.BLOCK_NAME:oracle
2---testBlock.BLOCK_ID:2
2---testBlock.BLOCK_NAME:mysql

结论是 TestBlock._meta.db_table = 'TEST_BLOCK_T_' + '1'可以动态创建表,而动态选择表只能用TestBlock = getBlockModel('TEST_BLOCK_T_' + '1') 这样的方式。

django动态创建表和动态选择实体的更多相关文章

  1. YII2框架动态创建表模型

    YII2框架动态创建表模型 在YII2中,每个表对应一个model类 在开发过程中,我们在填写一个大型表单的时候,表单里有N个select下拉列表,每个下拉select来自于不同的表: 如果要在程序里 ...

  2. python在sqlite动态创建表源码

    代码之余,将开发过程中经常用的代码片段备份一下,如下的代码是关于python在sqlite动态创建表的代码,应该能对各位有所用. import sqlite3 as db conn = db.conn ...

  3. MyBatis动态创建表

    转载请注明出处:https://www.cnblogs.com/Joanna-Yan/p/9187538.html 项目中业务需求的不同,有时候我们需要动态操作数据表(如:动态建表.操作表字段等).常 ...

  4. OrmLite动态创建表,一个实体类创建多张表的的偏招

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/LonelyRoamer/article/details/26299355 在做一个Android的项 ...

  5. Spring Boot:实现MyBatis动态创建表

    综合概述 在有些应用场景中,我们会有需要动态创建和操作表的需求.比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等.这个时候就需要我们动态的生成和操作数据库表了. ...

  6. 菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表

    项目用的是SSH基础框架,当中有一些信息非常相似,但又不尽同样.假设每个建一个实体的话,那样实体会太多.假设分组抽象,然后继承,又不是特别有规律.鉴于这样的情况.就打算让用户自己配置要加入的字段,然后 ...

  7. SQL Server 动态创建表结构

    需求是,在word里面设计好表结构(主要在word中看起来一目了然,方便维护),然后复制sql 里面,希望动态创建出来 存储表结构的表 CREATE TABLE [dbo].[Sys_CreateTa ...

  8. C# 动态创建类,动态创建表,支持多库的数据库维护方案

    1.创建表 SqlSugar支持了3种模式的建表,非常的灵活,可以MYSQL MSSQL ORACLE等用同一语法创建数据库,不需要考虑数据库的兼容性 中间标准: string  大文本 5.1.3. ...

  9. JS动态创建表单post提交

    <script> //@创建表单方法 function post(URL, PARAMS) { var temp = document.createElement("form&q ...

  10. java 动态创建数据库和动态连接数据库

    项目中有一个需求要动态创建数据库并且要动态连接数据库,本来以为还很难实现呢,在网上找了好久,都不是很理想,最后看到有人说创建数据库时,先连接到任意一个数据库,获得连接后用createStatement ...

随机推荐

  1. Python批量改文件名

    对以下路径中的文件名批量修改. 一.读取指定路径中的文件名 #导入标准库 import os #读取文件名 filesDir = "路径--" fileNameList = os. ...

  2. STM32外设:通用输入输出 GPIO、EXIT

    主要外设: GPIO:General Purpose I/O 一般用途IO EXIT:External Interrupt/Event Controller 外部中断/事件控制器(STM32) 辅助外 ...

  3. DRF过滤器

    https://www.django-rest-framework.org/api-guide/filtering 一般情况下,我们可以重写DRF视图类的get_queryset()方法来实现查询结果 ...

  4. 文心一言 VS 讯飞星火 VS chatgpt (166)-- 算法导论13.1 6题

    六.用go语言,在一棵黑高为 k 的红黑树中,内部结点最多可能有多少个?最少可能有多少个? 文心一言: 红黑树是一种自平衡的二叉查找树,其中每个节点都有一个颜色属性,可以是红色或黑色.红黑树满足以下性 ...

  5. 【难受】SpirngCloud-Alibaba-nacos跨服务器访问接口的问题

    原想法:我首先准备了 一个网关 2个服务 分别将两个服务部署到不同的远程服务器当中 实现跨服务器访问接口 网关为本地调用--这里就不一一介绍了 问题 利用gateway做路由时出现服务不可用的情况,看 ...

  6. 升级高版本springboot2.6.x:org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata

    升级springboot高版本2.6.x 项目使用到了springcloud的oauth2依赖,直接升级springboot项目版本为最新 2.6.8(2022年6月16日)将会报以下错误: org/ ...

  7. Windows使用docker踩坑记录

    一.安装踩坑 安装时会让你选择:是否使用Windows容器 Use Windows containers instead of Linux containers(this can be changed ...

  8. ROMA集成关键技术:增量数据集成

    摘要:本文将详解ROMA集成关键技术-增量数据集成技术. 本文分享自华为云社区<ROMA集成关键技术(2)-增量数据集成技术>,作者:华为云PaaS服务小智 . 1.概述 ROMA平台的核 ...

  9. 实践案例丨CenterNet-Hourglass论文复现

    摘要:本案例是CenterNet-Hourglass论文复现的体验案例,此模型是对Objects as Points 中提出的CenterNet进行结果复现. 本文分享自华为云社区<Center ...

  10. Python 初学者必看:Python 异常处理集合

    摘要:作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,本文专门介绍 python 异常处理. 异常 广义上的错误分为错误和异常 错误指的是可以人为避免 异常是指在语 ...