Background
django模型定义的orm类明明都添加了默认值、表注释、字段注释,但迁移后在数据库中生成的表中却没有。这里我们通过修改Django源代码,支持表注释、字段注释和字段默认值。
-
修改前
-
修改后
-
用户模型
1、找到配置文件 schema.py
这个文件所在的目录:
{python3安装目录}/Lib\site-packages\django\db\backends\base\schema.py
这是我的:D:\software\python3.7.8\Lib\site-packages\django\db\backends\base\schema.py
2、修改table_sql
和column_sql
函数
- table_sql
# 【wlf-2021-1103】添加mysql表注释
if self.connection.client.executable_name == 'mysql' and model._meta.verbose_name:
sql += " COMMENT '%s'" % model._meta.verbose_name
- column_sql
# 【wlf-2021-1103】添加字段默认值和字段注释
exec_name = self.connection.client.executable_name
field_name = field.name
field_default_value = field.default
field_verbose_name = field.verbose_name
name_include = ['create_time', 'update_time']
if exec_name == 'mysql' and (field_default_value != NOT_PROVIDED and not callable(field_default_value)
and not isinstance(field_default_value, bool)) or field_name in name_include:
if field_name == 'create_time':
sql = sql.replace('datetime(6)', 'datetime').replace('NOT NULL', 'DEFAULT CURRENT_TIMESTAMP')
elif field_name == 'update_time':
sql = sql.replace('datetime(6)', 'datetime').replace('NOT NULL', 'DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP')
else:
sql += " DEFAULT '%s'" % str(field_default_value)
if exec_name == 'mysql' and field_verbose_name:
sql += " COMMENT '%s'" % field_verbose_name
3、清除django缓存,重新迁移就行了,这里给个初始化脚本
import os
import shutil
from yl_pms import utils
def print_info(msg):
"""打印信息"""
print("< {} >".format(msg).center(80, "="))
print('')
def init():
# 创建数据模型
cmd1 = 'python manage.py makemigrations'
os.system(cmd1)
msg = 'virtual model create success'
print_info(msg)
# 创建真实的数据表
cmd2 = 'python manage.py migrate'
os.system(cmd2)
msg = 'real model create success'
print_info(msg)
# 创建超级管理员
msg = '\033[1;32;41mPlease run the following command to create a superuser manually !\033[0m'
print(msg)
cmd3 = 'python manage.py createsuperuser'
msg = '\033[4;34;34m{}\033[0m'.format(cmd3)
print_info(msg)
def rm_cache():
"""删除缓存"""
cache_dir = 'pms/migrations/'
dir_rm = '__pycache__'
str1_rm = 'initial.py'
str2_rm = '_auto_'
li = os.listdir(cache_dir)
for f in li:
if dir_rm == f:
shutil.rmtree(cache_dir + dir_rm)
elif str1_rm in f or str2_rm in f:
os.remove(cache_dir + f)
msg = 'cache rm success'
print_info(msg)
if __name__ == '__main__':
"""该脚本需要和manage.py在同一目录"""
# utils.MysqlUtil.del_db()
utils.MysqlUtil.create_db()
rm_cache()
init()