django动态创建表和动态选择实体
开发有时需要动态创建表,创建完成后需要动态选择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动态创建表和动态选择实体的更多相关文章
- YII2框架动态创建表模型
YII2框架动态创建表模型 在YII2中,每个表对应一个model类 在开发过程中,我们在填写一个大型表单的时候,表单里有N个select下拉列表,每个下拉select来自于不同的表: 如果要在程序里 ...
- python在sqlite动态创建表源码
代码之余,将开发过程中经常用的代码片段备份一下,如下的代码是关于python在sqlite动态创建表的代码,应该能对各位有所用. import sqlite3 as db conn = db.conn ...
- MyBatis动态创建表
转载请注明出处:https://www.cnblogs.com/Joanna-Yan/p/9187538.html 项目中业务需求的不同,有时候我们需要动态操作数据表(如:动态建表.操作表字段等).常 ...
- OrmLite动态创建表,一个实体类创建多张表的的偏招
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/LonelyRoamer/article/details/26299355 在做一个Android的项 ...
- Spring Boot:实现MyBatis动态创建表
综合概述 在有些应用场景中,我们会有需要动态创建和操作表的需求.比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等.这个时候就需要我们动态的生成和操作数据库表了. ...
- 菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表
项目用的是SSH基础框架,当中有一些信息非常相似,但又不尽同样.假设每个建一个实体的话,那样实体会太多.假设分组抽象,然后继承,又不是特别有规律.鉴于这样的情况.就打算让用户自己配置要加入的字段,然后 ...
- SQL Server 动态创建表结构
需求是,在word里面设计好表结构(主要在word中看起来一目了然,方便维护),然后复制sql 里面,希望动态创建出来 存储表结构的表 CREATE TABLE [dbo].[Sys_CreateTa ...
- C# 动态创建类,动态创建表,支持多库的数据库维护方案
1.创建表 SqlSugar支持了3种模式的建表,非常的灵活,可以MYSQL MSSQL ORACLE等用同一语法创建数据库,不需要考虑数据库的兼容性 中间标准: string 大文本 5.1.3. ...
- JS动态创建表单post提交
<script> //@创建表单方法 function post(URL, PARAMS) { var temp = document.createElement("form&q ...
- java 动态创建数据库和动态连接数据库
项目中有一个需求要动态创建数据库并且要动态连接数据库,本来以为还很难实现呢,在网上找了好久,都不是很理想,最后看到有人说创建数据库时,先连接到任意一个数据库,获得连接后用createStatement ...
随机推荐
- 小程序的登录授权与退出功能(wx.getUserProfile)
一.授权登录:wx.getUserProfile 1.使用wx.getUserProfile实现登录 1.javascript: login(){ wx.getUserProfile({ desc: ...
- 没错,数据库确实应该放入 K8s 里!
昨天冯老板发了一篇文章探讨了为什么将数据库放入 K8S 中不是一个明智的选择. 如果是四年前有人质疑容器化数据库我觉得还可以 battle 一下,都 2023 年了还有人不能认清这个大势,我就有必要来 ...
- [ARC144E]GCD of Path Weights
Problem Statement You are given a directed graph $G$ with $N$ vertices and $M$ edges. The vertices a ...
- springBoot——整合mybatis
spring整合mybatis springBoot整合mybaits 配置文件 spring: datasource: url: jdbc:mysql://localhost:3306/test d ...
- 解决win10的wifi打不开或无法搜索到周围wifi的问题
今天笔者遇到了一个比较奇葩的问题,就是笔记本电脑的wifi打不开了,即使打开了也是搜索不到周围的wifi的.这个问题一开始笔者没有发现,因为在暑假期间都是使用笔记本连接自己的手机热点进行上网的.然而暑 ...
- 初识BigDecimal
BigDecimal所创建的是对象,我们不能使用传统的+.-.*./等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法. 方法中的参数也必须是BigDecimal的对象. BigDecim ...
- ASR项目实战-方案设计
对于语音识别产品的实施方案,给出简易的业务流程,仅供参考. 如下流程图,可以使用如下两个站点查看. web chart Web Sequence Diagrams 文件转写 创建文件转写任务 客户应用 ...
- MinIO客户端之ping
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc ping 检查指定的MinIO节点的服务是否可用. 不带参数,命令如下: ./mc ping local1 ...
- 从零玩转第三方登录之WeChat公众号登陆-cong-ling-wan-zhuan-di-san-fang-deng-lu-zhi-wechat-gong-zhong-hao-deng-lu
title: 从零玩转第三方登录之WeChat公众号登陆 date: 2022-09-03 16:32:57.876 updated: 2022-09-03 16:32:57.876 url: htt ...
- vulnhub - lazySysAdmin - writeup
信息收集 可以看到目标开放了常见的22, 80, 139, 445, 3306这个6667的服务少见. root@kali tmp/lazySysAdmin » arp-scan -I eth1 -l ...