chore(docker): 更新初始化脚本

This commit is contained in:
2025-12-03 14:40:51 +08:00
parent 7d8c2d4e37
commit 8489ef35cb
3 changed files with 11436 additions and 11075 deletions

View File

@@ -762,6 +762,10 @@ CREATE TABLE `lucky_cashier_auth_group` (
`keyword` varchar(255) NOT NULL DEFAULT '' COMMENT '关键字 自定义权限组为空',
`site_id` int(11) NOT NULL DEFAULT '0' COMMENT '站点id',
`desc` varchar(2000) NOT NULL DEFAULT '',
`store_id` int NOT NULL DEFAULT '0' COMMENT '门店id 0为全部门店',
`store_name` varchar(255) NOT NULL DEFAULT '' COMMENT '门店名称',
`create_user_data` varchar(500) NOT NULL DEFAULT '[]' COMMENT '创建用户数据 json格式',
`create_uid` int NOT NULL DEFAULT '0' COMMENT '创建用户id',
PRIMARY KEY (`group_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -930,6 +934,8 @@ CREATE TABLE `lucky_cron` (
`execute_time` int(11) NOT NULL DEFAULT '0' COMMENT '待执行时间',
`relate_id` int(11) NOT NULL DEFAULT '0' COMMENT '关联关键字id',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`error_num` int NOT NULL DEFAULT 0 COMMENT '错误次数',
`status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 0待执行 1执行中',
PRIMARY KEY (`id`) USING BTREE,
KEY `IDX_sys_cron_execute_time` (`execute_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4119 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='计划任务表';
@@ -1332,6 +1338,7 @@ CREATE TABLE `lucky_express_delivery_package` (
`type` varchar(20) NOT NULL DEFAULT '' COMMENT '发货方式manual 手动发货 electronicsheet 电子面单发货)',
`template_id` int(11) NOT NULL DEFAULT '0' COMMENT '电子面单模板id',
`template_name` varchar(255) NOT NULL DEFAULT '' COMMENT '电子面单模板名称',
`trace` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '物流轨迹',
PRIMARY KEY (`id`) USING BTREE,
KEY `IDX_ns_express_delivery_package_order_id` (`order_id`) USING BTREE,
KEY `IDX_ns_express_delivery_package_site_id` (`site_id`) USING BTREE
@@ -1825,6 +1832,7 @@ CREATE TABLE `lucky_fenxiao_withdraw` (
`audit_time` int(11) NOT NULL DEFAULT '0' COMMENT '审核时间',
`refuse_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '拒绝理由',
`applet_type` int(11) NOT NULL DEFAULT '0',
`fail_reason` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '失败原因',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='会员余额提现记录表';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -2599,6 +2607,9 @@ CREATE TABLE `lucky_goods` (
`en_goods_name` varchar(255) DEFAULT NULL COMMENT '英文商品标题',
`pdf_url` varchar(255) DEFAULT NULL,
`pdf_name` varchar(255) DEFAULT NULL,
`is_reserve` int NOT NULL DEFAULT 0 COMMENT '服务是否需要预约01',
`service_mode` varchar(255) NOT NULL DEFAULT '' COMMENT '服务模式onsite上门服务in_store到店服务',
`service_price_way` varchar(255) NOT NULL DEFAULT '' COMMENT '上门服务费用方式reserve_price预约价格fixed_price一口价格',
PRIMARY KEY (`goods_id`) USING BTREE,
KEY `IDX_ns_goods_category_id` (`category_id`) USING BTREE,
KEY `IDX_ns_goods_goods_class` (`goods_class`) USING BTREE,
@@ -3464,6 +3475,8 @@ CREATE TABLE `lucky_group` (
`desc` varchar(255) NOT NULL DEFAULT '' COMMENT '描述',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modify_time` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
`create_user_data` varchar(500) NOT NULL DEFAULT '[]' COMMENT '创建用户数据 json格式',
`create_uid` int NOT NULL DEFAULT '0' COMMENT '创建用户id',
PRIMARY KEY (`group_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2123 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户组表';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -4035,6 +4048,7 @@ CREATE TABLE `lucky_member_goods_card` (
`status` smallint(6) NOT NULL DEFAULT '1' COMMENT '状态 1可用 0已失效',
`delivery_method` varchar(50) NOT NULL DEFAULT '' COMMENT '产品出库方式 buy 购买时出库 verify 核销时出库',
`store_id` int(11) NOT NULL DEFAULT '0' COMMENT '门店id',
`invalid_reason` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '失效原因',
PRIMARY KEY (`card_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='会员卡项表';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -4215,6 +4229,7 @@ CREATE TABLE `lucky_member_label` (
`modify_time` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
`remark` varchar(1000) NOT NULL DEFAULT '' COMMENT '备注',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
INDEX IDX_nc_member_label_label_id (`label_id`),
PRIMARY KEY (`label_id`) USING BTREE,
KEY `IDX_nc_member_label_label_id` (`label_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='会员标签';
@@ -5348,6 +5363,8 @@ CREATE TABLE `lucky_order` (
`host_order_id` int(11) NOT NULL DEFAULT '0' COMMENT '多商户订单主订单id',
`is_merch_settlement` int(11) NOT NULL DEFAULT '0' COMMENT '是否已经给商户结算0未结算1已结算',
`business` varchar(255) DEFAULT NULL COMMENT '业务员',
`delivery_start_time` int NOT NULL DEFAULT 0 COMMENT '配送开始时间',
`delivery_end_time` int NOT NULL DEFAULT 0 COMMENT '配送结束时间',
PRIMARY KEY (`order_id`) USING BTREE,
KEY `IDX_ns_order_create_time` (`create_time`) USING BTREE,
KEY `IDX_ns_order_finish_time` (`finish_time`) USING BTREE,
@@ -5468,6 +5485,11 @@ CREATE TABLE `lucky_order_goods` (
`card_promotion_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '次卡抵扣金额',
`supplier_id` int(11) NOT NULL DEFAULT '0' COMMENT '供应商id',
`is_adjust_price` int(11) NOT NULL DEFAULT '0' COMMENT '是否自定义价格',
`shop_active_refund_no` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '商家主动退款编号',
`shop_active_refund_remark` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '商家主动退款说明',
`shop_active_refund_money` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '商家主动退款金额',
`shop_active_refund_money_type` INT(11) NOT NULL DEFAULT 1 COMMENT '商家主动退款方式 1 原路退款 2线下退款3退款到余额',
`refund_images` varchar(3000) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '退款图片 最多五张',
PRIMARY KEY (`order_goods_id`) USING BTREE,
KEY `IDX_ns_order_goods_goods_id` (`goods_id`) USING BTREE,
KEY `IDX_ns_order_goods_is_fenxiao` (`is_fenxiao`) USING BTREE,
@@ -5699,6 +5721,8 @@ CREATE TABLE `lucky_pay` (
`balance_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '可提现余额',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '支付会员id',
`pay_json` varchar(255) NOT NULL DEFAULT '' COMMENT '支付扩展用支付信息',
`is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除 1是 0否',
`relate_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '关联id',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `UK_ns_pay_out_trade_no` (`out_trade_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='支付记录';
@@ -6128,6 +6152,8 @@ CREATE TABLE `lucky_poster` (
`pv_num` int(11) NOT NULL DEFAULT '0' COMMENT '访问数量',
`type` varchar(255) NOT NULL DEFAULT 'goods' COMMENT '类型goods商品friend_fission好友裂变',
`create_time` int(11) NOT NULL DEFAULT '0',
`param_md5` varchar(255) NOT NULL DEFAULT '' COMMENT '参数md5值',
`file_path` varchar(1000) NOT NULL DEFAULT '' COMMENT '文件路径',
PRIMARY KEY (`poster_id`) USING BTREE,
KEY `IDX_ns_poster` (`site_id`,`type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='海报表';
@@ -6768,6 +6794,8 @@ CREATE TABLE `lucky_promotion_coupon` (
`start_time` int(11) NOT NULL DEFAULT '0' COMMENT '可使用的开始时间',
`end_time` int(11) NOT NULL DEFAULT '0' COMMENT '有效期结束时间',
`merch_id` int(11) NOT NULL DEFAULT '0' COMMENT '商户id',
`use_channel` varchar(50) NOT NULL DEFAULT 'all' COMMENT '使用渠道 all 线上线下使用 online 线上使用 offline线下使用',
`use_store` varchar(5000) NOT NULL DEFAULT 'all' COMMENT '适用门店 all 全部门店 ,门店id,门店id, 部分门店',
PRIMARY KEY (`coupon_id`) USING BTREE,
KEY `IDX_ns_promotion_coupon_coupon_type_id` (`coupon_type_id`) USING BTREE,
KEY `IDX_ns_promotion_coupon_end_time` (`end_time`) USING BTREE,
@@ -6841,6 +6869,11 @@ CREATE TABLE `lucky_promotion_coupon_type` (
`promotion_type` int(11) NOT NULL DEFAULT '0' COMMENT '发布类型 0为普通优惠券 1为瓜分优惠券',
`promotion_name` varchar(64) NOT NULL DEFAULT '' COMMENT '发布插件名称',
`merch_id` int(11) NOT NULL DEFAULT '0' COMMENT '商户id',
`use_channel` varchar(50) NOT NULL DEFAULT 'all' COMMENT '使用渠道 all 线上线下使用 online 线上使用 offline线下使用',
`use_store` varchar(5000) NOT NULL DEFAULT 'all' COMMENT '适用门店 all 全部门店 ,门店id,门店id, 部分门店',
`store_id` int NOT NULL DEFAULT 0 COMMENT '所属门店id',
`goods_names` varchar(3000) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '适用商品名称',
`give_count` int NOT NULL DEFAULT 0 COMMENT '发放数量(营销活动发放和直接发放)',
PRIMARY KEY (`coupon_type_id`) USING BTREE,
KEY `IDX_ns_promotion_coupon_type_site_id` (`site_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='优惠券类型表';
@@ -7569,6 +7602,8 @@ CREATE TABLE `lucky_promotion_jielong` (
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`desc` varchar(255) DEFAULT NULL COMMENT '活动描述',
`take_start_time` int(11) NOT NULL DEFAULT 0 COMMENT '自提开始时间',
`take_end_time` int(11) NOT NULL DEFAULT 0 COMMENT '自提结束时间',
PRIMARY KEY (`jielong_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='接龙活动表';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -8323,6 +8358,8 @@ CREATE TABLE `lucky_promotion_presale_order` (
`is_deposit_back` int(11) NOT NULL DEFAULT '0' COMMENT '是否退定金是0 否1',
`deposit_agreement` text COMMENT '定金协议',
`relate_order_id` int(11) NOT NULL DEFAULT '0' COMMENT '关联订单id',
`delivery_start_time` int NOT NULL COMMENT '配送开始时间',
`delivery_end_time` int NOT NULL COMMENT '配送结束时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='预售定金表';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -9676,6 +9713,7 @@ CREATE TABLE `lucky_stock_allot` (
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`to_verify_time` int(11) NOT NULL DEFAULT '0' COMMENT '确认待审时间',
`verify_time` int(11) NOT NULL DEFAULT '0' COMMENT '审核时间',
`refuse_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '拒绝理由',
PRIMARY KEY (`allot_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='调拨管理';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -9933,6 +9971,7 @@ CREATE TABLE `lucky_stock_inventory` (
`verifier_name` varchar(255) NOT NULL DEFAULT '' COMMENT '审核人名称',
`audit_time` int(11) NOT NULL DEFAULT '0' COMMENT '审核时间',
`refuse_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '拒绝理由',
`action_time` int NOT NULL DEFAULT 0 COMMENT '盘点时间',
PRIMARY KEY (`inventory_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='库存盘点单';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -10048,6 +10087,10 @@ CREATE TABLE `lucky_store` (
`store_images` text COMMENT '门店图片多图',
`store_introduce` longtext COMMENT '门店介绍',
`uniacid` int(11) DEFAULT NULL,
`open_date_config` varchar(1000) NOT NULL DEFAULT '[]' COMMENT '营业时间配置 json格式',
`out_open_date_o2o_pay` tinyint(1) NOT NULL DEFAULT 1 COMMENT '非营业时间能否下同城配送单 1能 0不能',
`close_show` tinyint(1) NOT NULL DEFAULT 0 COMMENT '门店休息是否前台展示',
`close_desc` varchar(255) NULL DEFAULT '' COMMENT '门店休息说明',
PRIMARY KEY (`store_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='线下门店表';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -10171,6 +10214,7 @@ CREATE TABLE `lucky_store_goods_sku` (
`cost_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '成本价',
`status` int(11) NOT NULL DEFAULT '0' COMMENT '上下架状态',
`real_stock` decimal(12,3) NOT NULL DEFAULT '0.000' COMMENT '仓库库存',
`is_delivery_restrictions` int NOT NULL DEFAULT 1 COMMENT '是否有起送限制 1 有 0 没有',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='门店sku表';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -10508,6 +10552,8 @@ CREATE TABLE `lucky_user` (
`login_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '最新登录ip',
`uniacid` int(11) DEFAULT '0' COMMENT '平台id=platform_shop表uniacid\r\n如果uniacid相同的为同一个平台',
`is_main` int(11) DEFAULT '0' COMMENT '如果=1为主号其他均分分号',
`create_user_data` varchar(500) NOT NULL DEFAULT '[]' COMMENT '创建用户数据 json格式',
`create_uid` int NOT NULL DEFAULT '0' COMMENT '创建用户id',
PRIMARY KEY (`uid`) USING BTREE,
KEY `IDX_ns_user` (`group_id`,`app_module`) USING BTREE,
KEY `IDX_ns_user_member_id` (`member_id`) USING BTREE,

308
update_table_structure.py Normal file
View File

@@ -0,0 +1,308 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re
import os
# 读取文件内容
def read_file(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
# 解析表结构,保留原始格式
def parse_table_structure(create_table_sql):
"""解析CREATE TABLE语句返回表结构信息保留原始格式"""
table_info = {}
# 提取完整表名(包括反引号)
table_name_pattern = re.compile(r'CREATE TABLE (.*?)\s*\(', re.IGNORECASE)
table_name_match = table_name_pattern.search(create_table_sql)
if table_name_match:
table_info['full_table_name'] = table_name_match.group(1).strip()
# 提取不带反引号的表名用于比较
bare_table_name = table_info['full_table_name'].strip('`')
table_info['table_name'] = bare_table_name
# 提取列信息,保留完整行格式
columns = []
# 找到括号内的内容
start_pos = create_table_sql.find('(') + 1
end_pos = create_table_sql.rfind(')')
table_body = create_table_sql[start_pos:end_pos]
# 处理每一行
lines = table_body.split('\n')
for line in lines:
line = line.strip()
# 跳过主键、索引等
if line.startswith('PRIMARY KEY') or line.startswith('UNIQUE KEY') or line.startswith('KEY') or line.startswith('CONSTRAINT'):
continue
if not line or line == ')':
continue
# 提取列名(带反引号或不带)
# 匹配第一个空格前的内容作为列名
column_name_end = line.find(' ')
if column_name_end == -1:
continue
column_name = line[:column_name_end]
# 提取不带反引号的列名用于比较
bare_column_name = column_name.strip('`')
columns.append({
'name': bare_column_name,
'full_name': column_name,
'full_line': line
})
table_info['columns'] = columns
table_info['create_sql'] = create_table_sql
return table_info
# 从niushop_database.sql中提取列定义用于更新
def extract_column_definitions(sql_content):
"""从SQL文件中提取列定义用于比较"""
column_definitions = {}
# 先匹配所有CREATE TABLE语句正确处理表结构
# 使用更严格的匹配,确保只匹配到真正的表定义
create_table_pattern = re.compile(r'CREATE TABLE `?(\w+)`?\s*\(([\s\S]*?)\)\s*(?:ENGINE|CHARACTER|COLLATE|COMMENT|;)', re.IGNORECASE | re.DOTALL)
create_table_matches = create_table_pattern.findall(sql_content)
for table_name, table_body in create_table_matches:
columns = {}
# 处理表体中的列定义
lines = table_body.split('\n')
for line in lines:
line = line.strip()
# 跳过主键、索引等
if line.startswith('PRIMARY KEY') or line.startswith('UNIQUE KEY') or line.startswith('KEY') or line.startswith('CONSTRAINT'):
continue
if not line or line == ')':
continue
# 跳过ALTER TABLE语句
if line.startswith('ALTER TABLE'):
continue
# 跳过ENGINE等表选项
if line.startswith('ENGINE') or line.startswith('CHARACTER') or line.startswith('COLLATE') or line.startswith('COMMENT'):
continue
# 跳过CREATE TABLE语句
if line.startswith('CREATE TABLE'):
continue
# 提取列名
column_name_end = line.find(' ')
if column_name_end == -1:
continue
column_name = line[:column_name_end].strip('`')
# 提取完整列定义
# 去掉末尾的逗号
col_def = line
if col_def.endswith(','):
col_def = col_def[:-1]
columns[column_name] = col_def.strip()
column_definitions[table_name] = columns
# 处理单独的ALTER TABLE语句提取添加的列
alter_table_pattern = re.compile(r'ALTER TABLE `?(\w+)`?\s*ADD COLUMN\s*(.*?);', re.IGNORECASE | re.DOTALL)
alter_table_matches = alter_table_pattern.findall(sql_content)
for table_name, column_def in alter_table_matches:
if table_name in column_definitions:
# 提取列名
column_name_end = column_def.find(' ')
if column_name_end != -1:
column_name = column_def[:column_name_end].strip('`')
# 确保列定义是有效的
if not column_def.startswith('ALTER TABLE') and not column_def.startswith('ENGINE'):
column_definitions[table_name][column_name] = column_def.strip()
return column_definitions
# 从init.sql中提取表结构
def extract_init_table_structures(sql_content):
"""从init.sql中提取表结构保留完整格式"""
table_structures = {}
# 匹配所有CREATE TABLE语句
create_table_pattern = re.compile(r'(DROP TABLE IF EXISTS `?(\w+)`?;[\s\S]*?CREATE TABLE `?(\w+)`?\s*\(([\s\S]*?)\)\s*ENGINE\s*=[\s\S]*?;)\s*', re.IGNORECASE | re.DOTALL)
create_table_matches = create_table_pattern.findall(sql_content)
for full_sql, drop_table_name, create_table_name, table_body in create_table_matches:
# 提取列信息
columns = []
lines = table_body.split('\n')
for line in lines:
line = line.strip()
# 跳过主键、索引等
if line.startswith('PRIMARY KEY') or line.startswith('UNIQUE KEY') or line.startswith('KEY') or line.startswith('CONSTRAINT'):
continue
if not line or line == ')':
continue
# 提取列名
column_name_end = line.find(' ')
if column_name_end == -1:
continue
column_name = line[:column_name_end].strip('`')
# 提取完整列定义行
columns.append({
'name': column_name,
'full_line': line
})
table_structures[create_table_name] = {
'full_sql': full_sql,
'columns': columns
}
return table_structures
# 更新init.sql中的表结构
def update_table_structure(init_table, niushop_columns):
"""更新表结构,只添加缺失的列,保留原有格式"""
init_columns_dict = {col['name']: col for col in init_table['columns']}
# 检查是否有缺失的列
missing_columns = []
for col_name, niushop_col_def in niushop_columns.items():
if col_name not in init_columns_dict:
missing_columns.append(niushop_col_def)
if not missing_columns:
return init_table['full_sql'] # 没有变化返回原SQL
# 构建新的CREATE TABLE语句
create_sql = init_table['full_sql']
# 找到最后一个列定义行的位置
# 查找最后一个列定义行在PRIMARY KEY之前
last_col_pos = create_sql.rfind('PRIMARY KEY')
if last_col_pos == -1:
last_col_pos = create_sql.rfind(')')
# 查找最后一个列定义行的结束位置
# 从last_col_pos往前找换行符
newline_pos = create_sql.rfind('\n', 0, last_col_pos)
if newline_pos == -1:
newline_pos = create_sql.rfind('\n')
# 提取前面的内容
prefix = create_sql[:newline_pos].rstrip()
suffix = create_sql[newline_pos:]
# 添加缺失的列
for col_def in missing_columns:
# 保持与原有列相同的缩进
# 从原有列中获取缩进
if init_table['columns']:
first_col_line = init_table['columns'][0]['full_line']
indent = first_col_line[:len(first_col_line) - len(first_col_line.lstrip())]
else:
indent = ' '
# 添加新列,带缩进和逗号
prefix += f'\n{indent}{col_def},'
# 重新组合CREATE TABLE语句
new_create_sql = prefix + suffix
return new_create_sql
# 主函数
def main():
# 文件路径
niushop_file = './docs/db/niushop_database.sql'
init_file = './docker/mysql/init/init.sql'
upgrade_file = './upgrade.sql'
# 读取文件内容
print("正在读取文件内容...")
niushop_content = read_file(niushop_file)
init_content = read_file(init_file)
# 提取niushop_database.sql中的列定义
print("正在提取niushop_database.sql中的列定义...")
niushop_columns = extract_column_definitions(niushop_content)
print(f"从niushop_database.sql提取到 {len(niushop_columns)} 个表的列定义")
# 提取init.sql中的表结构
print("正在提取init.sql中的表结构...")
init_tables = extract_init_table_structures(init_content)
print(f"从init.sql提取到 {len(init_tables)} 个表结构")
# 比较表结构差异,生成更新
print("正在比较表结构差异...")
upgrade_statements = []
updated_init_content = init_content
# 遍历init.sql中的所有表
for init_table_name, init_table in init_tables.items():
print(f"正在处理表 {init_table_name}...")
# 去掉lucky_前缀与niushop_database.sql中的表名进行比较
original_table_name = init_table_name
if original_table_name.startswith('lucky_'):
original_table_name = original_table_name[6:] # 去掉lucky_前缀
# 检查niushop_database.sql中是否有对应的表
if original_table_name in niushop_columns:
print(f"找到对应的表 {original_table_name}...")
niushop_cols = niushop_columns[original_table_name]
# 检查缺失的列
init_cols_dict = {col['name']: col for col in init_table['columns']}
missing_columns = []
for col_name, niushop_col_def in niushop_cols.items():
if col_name not in init_cols_dict:
missing_columns.append({
'name': col_name,
'definition': niushop_col_def
})
# 如果有缺失的列生成ALTER语句并更新init.sql
if missing_columns:
print(f"{init_table_name} 缺少 {len(missing_columns)} 个列...")
# 生成ALTER TABLE语句
for col in missing_columns:
# 提取列名(带反引号)
col_name_in_def = col['definition'].split(' ')[0]
alter_stmt = f"ALTER TABLE `{init_table_name}` ADD COLUMN {col['definition']};"
upgrade_statements.append(alter_stmt)
# 更新init.sql中的表结构
new_create_sql = update_table_structure(init_table, niushop_cols)
updated_init_content = updated_init_content.replace(init_table['full_sql'], new_create_sql)
# 写入升级脚本
print("正在写入升级脚本...")
with open(upgrade_file, 'w', encoding='utf-8') as f:
f.write("-- 数据库升级脚本\n")
f.write("-- 生成时间: 自动生成\n")
f.write("-- 描述: 根据niushop_database.sql更新init.sql的表结构\n\n")
f.write("USE shop_mallnew;\n\n")
for stmt in upgrade_statements:
f.write(f"{stmt}\n")
# 更新init.sql文件
print("正在更新init.sql文件...")
with open(init_file, 'w', encoding='utf-8') as f:
f.write(updated_init_content)
print(f"升级脚本已生成,共 {len(upgrade_statements)} 条ALTER语句")
print(f"升级脚本路径: {upgrade_file}")
if __name__ == '__main__':
main()

7
upgrade.sql Normal file
View File

@@ -0,0 +1,7 @@
-- 数据库升级脚本
-- 生成时间: 自动生成
-- 描述: 根据niushop_database.sql更新init.sql的表结构
USE shop_mallnew;
ALTER TABLE `lucky_member_label` ADD COLUMN INDEX IDX_nc_member_label_label_id (label_id);