xls2ddl/xls2ddl.py
2025-06-24 11:50:40 +08:00

95 lines
2.2 KiB
Python
Executable File

# -*- coding:utf-8 -*-
import io
import sys
from traceback import print_exc
from xlsxData import CRUDData, xlsxFactory
import codecs
import json
from sqlor.ddl_template_sqlserver import sqlserver_ddl_tmpl
from sqlor.ddl_template_mysql import mysql_ddl_tmpl
from sqlor.ddl_template_oracle import oracle_ddl_tmpl
from sqlor.ddl_template_postgresql import postgresql_ddl_tmpl
from appPublic.myTE import MyTemplateEngine
from appPublic.folderUtils import listFile
tmpls = {
"sqlserver":sqlserver_ddl_tmpl,
"mysql":mysql_ddl_tmpl,
"oracle":oracle_ddl_tmpl,
"postgresql":postgresql_ddl_tmpl
}
def xls2ddl(xlsfile,dbtype):
data = None
if xlsfile.endswith('json'):
with codecs.open(xlsfile,'r','utf-8') as f:
data = json.load(f)
else:
d = xlsxFactory(xlsfile)
if d is None:
print(xlsfile, 'can not read data')
return
data = d.get_data()
if data is None:
print(xlsfile, 'not data return from XLSX file')
return
tmpl = tmpls.get(dbtype.lower())
if tmpl is None:
raise Exception('%s database not implemented' % dbtype)
e = MyTemplateEngine([])
s = e.renders(tmpl,data)
# print(data.data)
if data.data:
ins = gen_insert(data)
s = f"{s}\n{ins}\n"
return s
def gen_insert(xls):
tbl = xls.summary[0].name
lines = []
for d in xls.data:
ks = []
vs = []
for k,v in d.items():
ks.append(k)
if isinstance(v, str):
vs.append(f"'{v}'")
else:
vs.append(str(v))
line = f"insert into {tbl} ({','.join(ks)}) values ({','.join(vs)});"
lines.append(line)
return "\n".join(lines)
def model2ddl(folder,dbtype):
ddl_str = ''
for f in listFile(folder, suffixs=['xlsx','json']):
try:
ddl_str += f'\n-- {f}\n'
s = xls2ddl(f,dbtype)
ddl_str = f"{ddl_str}\n{s}\n"
except Exception as e:
print('Exception:',e,'f=',f)
print_exc()
return ddl_str
if __name__ == '__main__':
import sys
##解决windows 终端中输出中文出现
# UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 20249
# 错误
# BEGIN
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
#
# END
if len(sys.argv) < 3:
print('Usage:%s dbtype folder' % sys.argv[0])
sys.exit(1)
s = model2ddl(sys.argv[2], sys.argv[1])
print(s)