zoukankan      html  css  js  c++  java
  • django——实现水平分表

    水平分表

    # Create your models here.
    from django.db import models
    
    # 得到表模型类
    # name是表名,fields是字段,app_label是你的应用名(如:flow),module是应用下的模型(如:flow.models),options是元类选项
    def create_model(name, fields=None, app_label='', module='', options=None):
        class Meta:  # 模型类的Meta类
            pass
    
        if app_label:  # 必须在元类中设置app_label,相关属性可参考https://www.cnblogs.com/lcchuguo/p/4754485.html
            setattr(Meta, 'app_label', app_label)  # 更新元类的选项
    
        if options is not None:
            for key, value in options.items():
                setattr(Meta, key, value)  # 设置模型的属性
            attrs = {'__module__': module, 'Meta': Meta}  # 添加字段属性
        if fields:
            attrs.update(fields)  # 创建模型类对象
        return type(name, (models.Model,), attrs)  #用type动态创建类
    
    # 同步到数据库
    def install(custom_model):
        from django.db import connection
        from django.db.backends.base.schema import BaseDatabaseSchemaEditor
    
        """
        fix:
            editor = BaseDatabaseSchemaEditor(connection)
            try:
                editor.create_model(model=custom_model) # 会抛出个异常,不知为啥,但表会创建
            except AttributeError as error:
                print(error)
            在BaseDatabaseSchemaEditor类中有一个__enter__方法,
            需要通过with上下文打开以后deferred_sql变量才会在实例化后赋值给editor
            这样就不会有'BaseDatabaseSchemaEditor' object has no attribute 'deferred_sql'
            
        """
        with BaseDatabaseSchemaEditor(connection) as editor:
            editor.create_model(model=custom_model)
    
    
    def CreateNewTab(tabdate):
        fields = {
            "name": models.CharField(max_length=30),
            "job_number": models.IntegerField(unique=True),
            "even_shift": models.CharField(max_length=1024),
            "administrator_shift": models.CharField(max_length=1024),
            "middle_shift": models.CharField(max_length=1024),
            "meeting_ops": models.CharField(max_length=1024),
            "meeting_ops_manager": models.CharField(max_length=1024),
            "checking_station": models.CharField(max_length=1024),
            '__str__': lambda self: '%s %s %s %s %s %s %s %s' % (
                self.name,
                self.job_number,
                self.even_shift,
                self.administrator_shift,
                self.middle_shift,
                self.meeting_ops,
                self.meeting_ops_manager,
                self.checking_station,
            ), }
        options = {'ordering': [
            "name",
        ], 'verbose_name': 'valued customer', }
        custom_model = create_model1(name=tabdate, fields=fields, options=options, app_label='ops_shift_',module='flow.models')
        install(custom_model)  # 同步到数据库中
    
    # 判断表是否已经存在于数据库
    def is_table_exit():
        from django.db import connection
        tables = connection.introspection.table_names()
        if table_name in tables:
            print("该表已经存在数据库中了")
            return Response("该表已经存在数据库中了")
        CreateNewTab(table_name)  # 执行创建表
    
  • 相关阅读:
    vue-cli 中stylus写样式莫名报错?
    Github桌面端安装慢问题
    firefox无法使用yslow的解决方案
    vue安装找不到命令
    css解惑
    vs2015中ctrl+shift+F进行“在文件中查找”,有时候无效?
    WebStrom安装了angularjs插件,但是没有语法提示
    jq版本更新后无live函数的处理.
    word每次打开都要选择文档类型
    百度编辑器1.4.3 .net版在vs2008的使用方法
  • 原文地址:https://www.cnblogs.com/pythonwl/p/14681990.html
Copyright © 2011-2022 走看看