django动态创表与查询

2023-05-16

前言:
django的分表与动态关联实在是令人扎心,考虑到以后的分表操作,故此debug查看了一波源码,记录一下。

from django.db import models
from django.db import connection


class Book(models.Model):

    @classmethod
    def get_sharding_model(cls, id, flag=True):
    	# 简单分表规则
        piece = id % 2 + 1

        class Meta:
            db_table = 'Book_%s' % piece

        attrs = {'Meta': Meta, '__module__': cls.__module__}
        if not flag:
        	# 将创建字段的方式改为属性的方式调用
            attrs.update({'name': models.CharField(max_length=256)})
            return type(Meta.db_table, (models.Model,), attrs)
        else:
            return type(Meta.db_table, (cls,), attrs)

    @classmethod
    def sharding_get(cls, id):
        model = cls.get_sharding_model(id=id)
        return model

    @classmethod
    def create_table(cls, id):
        model = cls.get_sharding_model(id=id, flag=False)
        # connection是django初始化的数据库的操作对象,也可以调用相应的api,直接传入sql语句,这里不详细介绍。
        with connection.schema_editor() as schema_editor:
            schema_editor.create_model(model)

    class Meta:
    	# 声明为抽象类
        abstract = True

调用方式:

Book.create_table(4)
Book= Book.sharding_get(3)
print(Book.objects.all())

今天先到这里了,后续再研究了,orm的动态创建着实痛苦,django的封装太深了,包括使用classmeta…

上述虽然实现了,但是还是感觉不方便,后续阅读了源码,发现model类后初始化一个_meta的属性来接收db_table,而实际上去创建模型的时候用的也是这个表名。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from django.db import models
from django.db import connection


class Book(models.Model):
    code = models.CharField(max_length=18, unique=True, verbose_name="编码")
    name = models.CharField(max_length=18, unique=True, verbose_name="名称")

    class Meta:
        db_table = 'book'
        verbose_name = 'Book'
        verbose_name_plural = verbose_name

    @classmethod
    def set_split_table_rule(cls, id):
        # 简单分表规则
        piece = id % 2 + 1
        return piece

    @classmethod
    def get_table_name(cls, id):
        prefix = cls.set_split_table_rule(id)
        return '{}_{}'.format(cls._meta.db_table.split('_')[0], prefix)

    @classmethod
    def set_model_table_name(cls, id=1):
        cls._meta.db_table = cls.get_table_name(id)
        return cls._meta.db_table

    @staticmethod
    def is_exists(table_name):
        return table_name in connection.introspection.table_names()

    @classmethod
    def create_model(cls, id):
        table_name = cls.set_model_table_name(id=id)
        if not cls.is_exists(table_name):
            with connection.schema_editor() as schema_editor:
                schema_editor.create_model(cls)

通过以上可以实现简单的动态分表的操作,至于分库使用数据库路由配置即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

django动态创表与查询 的相关文章

  • 程序员应该如何去设计需求

    刚出道的程序员 xff0c 在做需求分析的时候 xff0c 总是经常挨批 xff0c 客户说他们不能按照客户的要求去设计原型 xff0c 领导说他们不用心去与客户沟通交流 程序员总是感到自己很冤枉 xff0c 明明客户没有给出一点建设性建议
  • Android硬件开发之——使用Android Beam传输文本

    前言 本文主要讲述使用Android Beam传输文本 xff0c 内容包含 xff1a Android Beam的基本理念Android Beam API实例 Android Beam Android Beam的基本理念 Android
  • 小小程序员的一周日报

    工作依旧在有条不紊的进行着 xff0c 一周的时间很快就会过去 xff0c 正如今天李哥所说的 xff0c 这一周还没有感觉怎么过呢 xff0c 就结束了 是啊 xff0c 这就是我们的工作 xff0c 程序员的工作 xff0c 软件设计师
  • 项目空间都有啥

    项目空间是什么 xff0c Workplace 答案是 xff1a No 项目空间是由项目负责人提出的实施某项目方案的一种流程 项目空间是XX海油ERP管理系统下的一个业务 xff0c 项目负责人通过创建项目名称 项目负责人 使用资源 所属
  • 你不要瞧不起Ctrl+C

    曾经 xff0c 在我未参加工作之前 xff0c 我认为靠 Ctrl 43 C 来完成工作的人 xff0c 肯定是懒惰的程序员 xff0c 但是现在我发现我错了 xff0c 而且是彻底的错了 能够通过 Ctrl 43 C 来完成工作的人 x
  • 文档交接说明书(模板)

    因为同事的离职 xff0c 我的入职 xff0c 要从同事手中交接过来一些项目 公司里只有一些开发文档相关的模板 xff0c 并没有文档交接相关的模板 xff0c 所以交接文档的模板也就由我们自己来定 我结合自己在工作中的经验 xff0c
  • Java如何打印输出九九乘法表

    Java如何打印输出九九乘法表 打印乘法表的方法 1 使用双重for循环打印九九乘法表 2 使用do while 实现打印九九乘法表 双重for循环的使用 打印结果如图示 xff1a Java程序源代码如下 xff1a span class
  • 服务器出现大量 TIME_WAIT,如何解决

    经常在服务器发现一些连接出现 TIME WAIT 状态 xff0c 那么为什么会有 TIME WAIT状态 xff0c 它是如何产生的 xff1f 大量的 TIME WAIT 有什么危害 xff1f 如何排查 xff1f 如何优化 xff1
  • 【Mariadb/Mysql】利用JSON函数巧妙实现行列置换提高系统效率

    在现实生活中 xff0c 往往我们需要创建一些One to Many或Many to Many的关系数据表 例如 xff1a 按照Configuration Solution的设计 xff0c 产品与产品参数表的关系 xff0c 往往一种产
  • msvcp120.dll丢失的最新解决方法

    下载msvcp120 dll打开浏览器后在顶部输入 dll修复程序 site 按下电脑键盘的回车键打开下载msvcp120 dll系统文件 msvcp120 dll文件下载完成点击解压安装包 然后右键打开修复安装包文件电脑提示找不到msvc
  • VirtualBox Windows下开机自启动

    背景 我们本地使用Virtualbox虚拟机的时候 xff0c 有些虚拟机需要开机自启动 方案 STEP 1 编写start bat脚本 34 D Program Files Oracle VirtualBox VBoxManage exe
  • js模拟C#Matches方法。

    水平有点低 xff0c 感觉应该这样写 var str 61 34 今年是2013年7月24日12 00 12 xff0c 我打算在2023年7月24日12 01 10登月 34 function Matches inputStr reg
  • MFC在其他线程中刷新主对话框中EDIT等控件数据

    为了程序稳定性 xff0c 在数据处理线程中 xff0c 所有与主UI线程有关的控件数据刷新应该到主UI线程中处理 也就是数据处理线程发消息 xff0c 让界面UI去更新控件 例如在项目中用到EDIT控件需要实时更新数据 xff0c 用Po
  • 多线程之生产者消费者模式

    文章目录 基本组成阻塞队列有界队列与无界队列ArrayBlockingQueueLinkedBlockingQueueSynchronousQueue 流量控制与信号量 Semaphore 双缓冲与Exchanger 基本组成 生产者 xf
  • IDEA用Maven创建SpringMVC项目和配置(XML配置方法)

    IDEA用Maven创建SpringMVC项目和配置 xff08 XML配置方法 xff09 一个人的百度甚是寂寞 xff0c 最近在写Java后台 xff0c 用Maven创建的SpringMVC项目可谓爬了很多的坑 xff0c 在百度滚
  • 解决mysql的赋权操作之GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION问题

    一种情况 mysql的赋权操作 GRANT ALL PRIVILEGES ON TO root IDENTIFIED BY 123456 WITH GRANT OPTION mysql赋权操作 GRANT ALL PRIVILEGES ON
  • Ubuntu的recovery模式进入及退出

    如果root密码忘记 xff0c 可以进入recovery模式进行重置 或者当sudo命令出现错误时 xff0c 进入recovery模式可以修复 etc sudoers文件 recovery模式 1 启动Ubuntu系统 xff0c 过程
  • mxnet,nd中的asscalar()函数

    X asscalar 将向量X转换成标量 xff0c 且向量X只能为一维含单个元素的向量 X xff1a nd类型的数据 创建一个单个元素的向量 test 61 nd array 2 输出 xff1a 2 lt NDArray 1 64 c
  • YOLO v2和V3 关于设置生成anchorbox,Boundingbox边框回归的个人理解

    虽然阅读量不是很多 xff0c 但是没想到居然能得到这么多收藏和赞 xff0c 大家提出的问题 xff0c 我会不断更新 xff0c 尽量把过程解释得让大家都能了解清楚 PS xff1a 这篇文章是自己学习纪录下的笔记 xff0c 主要是通
  • 浪潮服务器NF5280m5 配置,raid和系统 安装纪录

    遇到的问题 xff1a 新到了一台服务器浪潮服务器NF5280m5 用u盘装ubantu系统 xff0c 一开始就找不到硬盘 xff0c 对于服务器0概念的新手来说太难弄了 xff0c 折腾了很久最后问客服解决了问题 服务器情况 xff1a

随机推荐

  • Longest Substring with K Distinct Characters (medium)

    刷题参考 xff1a https blog csdn net IBelieve2016 article details 104544763 include lt iostream gt include lt vector gt includ
  • vmvare ssh连不上,windows ping不通centos,centos能ping通windows

    写在前面 xff1a 此文章只对自己的电脑情况适应 xff0c 也仅为自己学习过程中的记录 xff0c 不对任何人负责 操作前记好自己原来的配置 xff0c 不适应的情况下还可以恢复 被楼下几个评论给恶心到了 x1f922 xff0c 刚学
  • 使用python-iptables库设置linux防火墙权限,只允许特定ip访问指定端口,通过web服务二次验证

    背景 xff1a 某天周末开着黑 xff0c 打着游戏 xff0c 吹着牛逼 xff0c 突然就被一条消息给打断了 经过分析发现可能是因为服务器账号密码设置太简单 xff0c 实验室服务器使用frp后 xff0c 被人下了挖矿脚本cnrig
  • 毕业论文 - 写作问题总结 和 tips

    主要是一些我自己写论文碰到的问题总结 xff0c 将经验分享出来 xff0c 帮助每一个写论文的苦逼学子 1 论文格式 可以知网找到往届师兄姐的论文 xff0c 找导师要学校的论文格式的文档 xff0c 对照格式写 2 在word里面提前设
  • 【C#】——系统编码规范

    C 系统编码规范 开发程序时 xff0c 往往会有很多人参与 xff0c 为了时程序与代码风格标准化 xff0c 以便于时每个参与才发的人员尽可能直观地查看和理解其他人编写的代码 xff0c 需要在编码之前制定一套统一的编码规范 下面介绍一
  • 实现字典树

    自己实现的字典树版本 带详细注释 package leetcode LC class TrieNode 4个参数设置 以该节点字符为结尾的字符串数目 int end num 以该节点作为前缀字符的个数 int prefix num 是否是叶
  • python爬取html,反转义,双斜杠(\\)转换成单斜杠(\)字符被json正常解析

    新手刚学py不久 xff0c 用正则爬取数据的时候获得了一段json数据格式的段落 xff0c 抓取回来的时候发现本身的文档已经是加了双反斜杠 的字符串 xff0c 这时候我用json loads 格式化数据的时候出现错误 xff0c 搞了
  • Mysql插入数据去重方法

    最近写爬虫 xff0c 有需求需要将数据插入mysql xff0c 由于爬虫采用分布式 xff0c 可能会多次爬重复页 xff0c 这时候就需要对数据去重 假设 xff1a 表 xff1a test 含 id xff0c a xff0c b
  • IBM的云平台Bluemix使用初体验-创建第一个容器

    概述 第一次使用IBM的云平台Bluemix xff0c 写一个blog记录一下 我注册Bluemix挺早的 xff0c 但是在工作中一直没有机会使用IBM的云平台 现在辞职创业 xff0c 做自己喜欢的互联网 xff0c 终于有机会用上了
  • 在Source Insight中添加对.cc的支持

    Options gt Document Options Document Type gt 下拉选择 xff1a C 43 43 Source File 在File Filter 中加入 cc
  • Android HFP流程记录

    DP 完成后 xff0c btif dm c文件中 xff0c btif dm search services evt函数 xff0c bond state changed BT STATUS SUCCESS amp bd addr BT
  • OPP文件传输

    在RFCOMM连接后 xff0c 进行Command Type Parameter Negotiation时 xff0c 会协商Credits初始值 建立OBEX连接时 xff0c 会将poll bit设置 xff0c 用于Given Cr
  • 关于ctags的使用

    第一步 xff1a 首先安装ctags sudo apt get install ctags 第二步 xff1a 在你要编辑的源码目录下ctags R 注意 xff1a 这个源码目录就是你要编写代码的目录 xff0c 不是其它的目录 xff
  • 踩坑之react生命周期

    问题情景 创建组件tableCom xff0c 用来渲染表格 xff0c 实质还是使用antd里的table xff0c 但是重新包装一下是为了columns和dataSource通过外部数据传入 span class hljs tag l
  • C++求素数

    问题描述 输入1 999内的正整数 xff0c 判断其是否为素数 xff0c 是素数输出 yes xff0c 不是素数输出 flase 输入形式 输入一个1 999内的正整数 输出形式 输出 yes 或 false 样例输入 13 样例输出
  • Git ubuntu 升级

    外文文档 This team will distribute the most current stable package of Git for Ubuntu Stable releases https launchpad net git
  • RxJava2 源码分析二

    文章目录 前言RxJava2 线程调度RxJava2 怎么进行线程调度总结 前言 经过RxJava2源码分析一 xff0c 我们了解了RxJava2是怎么进行数据的发送和接收 那么这次我们主要是来分析 xff0c RxJava2是如何进行线
  • 如何在Ubuntu 20.04上安装Google Chrome浏览器

    Chrome适用于所有主要操作系统和硬件平台 xff0c 可让您在所有设备上同步书签 xff0c 历史记录和密码 在Ubuntu上安装Google Chrome Chrome不是开放源代码浏览器 xff0c 它也不包含在标准Ubuntu存储
  • caffe安装--踩坑

    安装caffe xff0c 需要先安装cuda与cudnn xff0c 安装cuda之前 xff0c 需要先安装nvidia的驱动 xff0c 然后安装opencv xff0c 如果能将opencv踩过 xff0c 那么安装openpose
  • django动态创表与查询

    前言 xff1a django的分表与动态关联实在是令人扎心 xff0c 考虑到以后的分表操作 xff0c 故此debug查看了一波源码 xff0c 记录一下 from django db import models from django