开发有时需要动态创建表,创建完成后需要动态选择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. Cannot resolve symbol ‘c:forEach‘;Cannot resolve taglib with uri http://java.sun.com/jsp/jstl/corede

    #### Cannot resolve taglib with uri http://java.sun.com/jsp/jstl/core:等类似,都是因为 在jsp页面中加入<%@ tagli ...

  2. Java8新特性Stream流

    1.是什么? Stream(流)是一个来自数据源的元素队列并支持聚合操作 2.能干嘛? Stream流的元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需计算. 数 ...

  3. python操作redis集群、redis主从+哨兵

    主从+哨兵 from redis.sentinel import Sentinel if __name__ == '__main__': # 哨兵监听的别名,这个就是你redis配置中的名字 serv ...

  4. Javascript Ajax总结——GET请求和POST请求

    1.GET请求GET最常用于向服务器查询信息.可在URL末尾添加查询字符串参数.XHR中,传入open()方法的URL末尾的查询字符串必须经过正确的编码,使用encodeURIComponent()编 ...

  5. 从零玩转第三方登录之WeChat公众号扫码关注登陆 -wechatgzh

    title: 从零玩转第三方登录之WeChat公众号扫码关注登陆 date: 2022-09-27 22:46:53.362 updated: 2023-03-30 13:28:41.359 url: ...

  6. 分享.Net 设计模式大全

    由于最近项目处于维护阶段,工作没有那么匆忙了.于是开始回头整理一下常用设计模式. 虽说设计模式大家都知道,但是在写代码过程中为了抓项目进度有时候写着写着就变成面向过程开发了--后面维护起来将会相当的悲 ...

  7. Luogu P4524 Ceste 题解

    题目链接:\(\texttt{Luogu P4524 Ceste}\) 简化题意 给定一个有 \(n\) 个点 \(m\) 条边的无向图.每条边的边权为一个二元组 \((a, b)\),求以 \(1\ ...

  8. java常用正则表达式工具

    public class RegexUtils { /** * 是否是无效手机格式 * @param phone 要校验的手机号 * @return true:符合,false:不符合 */ publ ...

  9. gitee图床不能用了,心态崩了

    起因 大概上周五晚上吧,想着可以正常下班了.也没啥事,正好可以逛逛自己的小破站,看看有没有小伙伴留言什么的. 然后发现小破站图片显示不出来了... 一开始也没在意,想着可能是Gitee又挂了,可能一会 ...

  10. 7种创建方式,带你理解Java的单例模式

    本文分享自华为云社区<<Java极简设计模式>第01章:单例模式(Singleton)>,作者:冰 河. 单例设计模式 看几个单例对象的示例代码,其中有些代码是线程安全的,有些 ...