95 lines
2.2 KiB
Python
Executable File
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)
|
|
|