chore(docker): 更新初始化脚本
This commit is contained in:
@@ -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 '服务是否需要预约,0:否,1:是',
|
||||
`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
308
update_table_structure.py
Normal 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
7
upgrade.sql
Normal 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);
|
||||
Reference in New Issue
Block a user