首页 > 数据库 >手写 Django orm反向迁移 MySQL

手写 Django orm反向迁移 MySQL

时间:2023-06-12 16:25:00浏览次数:48  
标签:name db list Django orm MySQL modol table dataLong


import pymysql, os

#### settings
db = {
    'NAME': '',
    'USER': '',
    'PASSWORD': '',
    'HOST': '',
    'PORT': '',
}
table_name_list = []  # 表名列表,如果为空则查询库中所有的表
address = ""  # 存放文件的位置,如果为空则为当前路径


#### settings_end

# 对结果集美化方法
def dictfetchall(cursor):
    # 获取游标描述
    desc = cursor.description
    return [
        dict(zip([col[0] for col in desc], row))
        for row in cursor.fetchall()
    ]


modelsType = {
    'nvarchar': "CharField",
    'varchar': "CharField",
    'char': "CharField",
    'int': "IntegerField",
    'decimal': "DecimalField",
    'datetime': "DateTimeField",
    'real': "FloatField",
    "varbinary": "CharField",
    'text': "TextField",
    'date': "DateField",
    "datetime2": "DateTimeField",
    "float": "FloatField",
    "bit": "BooleanField",
    "smallint": "IntegerField",
    "pk": "AutoField",
    "bigint": "BigIntegerField",
    "longtext": "TextField",
    "double": "IntegerField",
}

conn = pymysql.connect(
    host=db['HOST'], user=db['USER'], password=db['PASSWORD'], database=db['NAME'])
cur = conn.cursor()
if not cur:
    raise (NameError, "连接数据库失败")
if not table_name_list:
    cur.execute("show tables;")
    table_name_list = dictfetchall(cur)
    table_name_list = [i['Tables_in_brm_db'] for i in table_name_list]
print(len(table_name_list))
address = "models.py" if not address else os.path.join(address, 'models.py')
with open(address, mode="w", encoding="utf-8") as f:
    f.write('from django.db import models\n')
    tc = []
    for table_name in table_name_list:  # table_name    表名
        if table_name in tc:
            continue
        else:
            tc.append(table_name)
            sql = "desc %s;" % table_name
            cur.execute(sql)
            l_list = dictfetchall(cur)  # 这张表的数据
            print(l_list)
            table_modol = "\nclass %s(models.Model):" % "".join([i.capitalize() for i in table_name.split('_')])
            for l in l_list:
                l_modol_in = 'db_column = "%s"' % l['Field']
                print("l['Type']", l['Type'])
                lType = l['Type'].split('(')
                dataType = lType[0]
                dataLong = lType[1].replace(")", "") if len(lType) == 2 else 0
                print("数据类型, 长度", dataType, dataLong)
                if dataLong and modelsType[dataType] == "DecimalField":
                    l_modol_in += f",max_digits={dataLong.split(',')[0]},decimal_places={dataLong.split(',')[1]}"
                elif dataLong and int(dataLong) > 0 and modelsType[dataType] != "IntegerField" \
                        and dataType != "DateTimeField":
                    l_modol_in += ',max_length=%s' % (dataLong)
                if l['Key'] == "PRI":
                    dataType = 'pk'
                    l_modol_in += ' , primary_key=True'
                if l['Null'] == "yes":
                    l_modol_in += ' , blank=True,null=True'

                l_modol = "\n\t%s = models.%s(%s)" % (l['Field'], modelsType[dataType], l_modol_in)  # orm的每列字段
                table_modol += l_modol

            meta_info = "\n\tclass Meta:\n\t\tmanaged = False\n\t\tdb_table = '%s'\n\n" % table_name

            f.write(table_modol)
            f.write(meta_info)
conn.close()
print("models生成完成\n生成表为%s" % [i for i in tc])


标签:name,db,list,Django,orm,MySQL,modol,table,dataLong
From: https://www.cnblogs.com/zlbgdy/p/17475337.html

相关文章

  • MySQL 允许远程连接
    下载的MySQL是8.0.33版本下载地址:https://dev.mysql.com/downloads/mysql/MySQL是部署在Win10的一台电脑上,要能其他机器也能访问,需要打开3306端口的防火墙,同时配置MySQL允许访问防火墙防火墙的设置在:设置-网络-Windows防火墙添加入站规则允许其他电脑访问mysql的33......
  • MySQL表结构转换为ClickHouse表结构
    MySQL表结构转换为ClickHouse表结构https://github.com/hcymysql/binlog_parse_sql/blob/main/mysql_to_clickhose_schema.pyhttps://github.com/hcymysql/binlog_parse_sql/blob/main/mysql_to_clickhose_schema_test.py(MySQL表结构转换为ClickHouse表结构,该工具仅为单表测试使用)C......
  • ORM总览
    ORM(Object-RelationalMapping)是一种常见的数据访问技术,它将对象模型和关系模型之间进行映射。ORM的主要作用是简化数据访问和管理,提高开发效率和代码质量。在实际应用中,ORM框架已经成为了开发人员的首选工具之一。但是,ORM框架并不是万能的,它也存在一些局限性和不足之处。在这篇......
  • SMARTFORMS 符号
    Smartform中,打印输出格式会经常出现问题,特别是金额、数量字段,如何解决打印时负号后置的问题呢?其实很简单:&field(<)&符号位显示在数据的左边补充:输出格式设置说明&field+&对于字符变量设置从何位置显示数据,如果offset大于字符变量长度时,系统......
  • MySQL闪回工具简介 及 binlog2sql工具用法
    一、闪回工具简介1.工具分类第一类以patch形式集成到官方工具mysqlbinlog中优点上手成本低。mysqlbinlog原有的选项都能直接利用,只是多加了一个闪回选项,未来有可能被官方收录。支持离线解析。缺点兼容性差、项目活跃度不高。难以添加新功能,实战效果欠佳。安装麻烦。需要对m......
  • MySQL 8.0.29 instant DDL 数据腐化问题分析
    前言Instantaddordropcolumn的主线逻辑表定义的列顺序与row存储列顺序阐述引入row版本的必要性数据腐化问题原因分析Bug重现与解析MySQL8.0.30修复方案前言DDL相对于数据库的DML之类的其他操作,相对来说是比较耗时、相对重型的操作;因此对业务的影比较严重。M......
  • mysql启动报can't create/write to file 'var/run/mysqld/mysqld.pid 错误解决办法
    msql启动报错,启动不了。进入mysql日志默认的路径为/var/log/mysqld.log查看日志,发现报错信息如下:can'tcreate/writetofile'var/run/mysqld/mysqld.pid解决办法:将/var/run/mysqld/权限赋给mysql执行以下命令即可:chown-Rmysql/var/run/mysqldchgrp-Rmysql/var/ru......
  • 一文解读MySQL事务
    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下。MySQL事务本文所说的MySQL事务都是指在InnoDB引擎下,MyISAM引擎是不支持事务的。数据库事务指的是一组数据操作,事务内的操作要么就是全......
  • mysql的基础语法
    启动/关闭数据库服务——mysqlnetstartmysql-开netstopmysql-关mysql-uroot-p密码showdatabases;——显示数据库dropdatabase数据库名;——删除数据库createdatabase数据库名;——创建数据库use数据库名;——使用数据库showtables;——查数据库中表selec......
  • MySQL8.0轻松搞定GTID主从复制
    selecttable_catalog   ,table_schema   ,table_name   ,enginefrominformation_schema.tableswhereengine='MyISAM';   MySQL命令查询所有MyISAM数据库     为什么需要主从复制? 通俗来讲,如果对数据库的读和写都在同一个数据库服务器......