diff --git a/docs/dbtable.md b/docs/dbtable.md index 7aefcda..d6fd6af 100644 --- a/docs/dbtable.md +++ b/docs/dbtable.md @@ -2,10 +2,14 @@ 数据库表用一个json格式文件或数据来定义,具体规范如下 { - "name" - "title" - "primary" - "catelog" # 可选项:entity relation dimession indication + "summary":[ # 仅一条记录 + { + "name" # 表名 + "title" # 表标题 + "primary" # 主键,等于"id",所有表的主键均为id + "catelog" # 可选项:entity relation dimession indication + } + ] "fields":[ # 字段 { "name" diff --git a/setup.cfg b/setup.cfg index eebb977..2ae0623 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name=xls2ddl -version = 1.0.4 +version = 1.1.0 description = a xlsx file to database ddl converter author = "yu moqing" author_email = "yumoqing@gmail.com" @@ -15,6 +15,7 @@ install_requires = [options.entry_points] console_scripts = + json2ddl = xls2ddl.json2ddl:main xls2ddl = xls2ddl.xls2ddl:main xls2ui = xls2ddl.xls2ui:main json2xlsx = xls2ddl.json2xlsx:main diff --git a/xls2ddl/json2ddl.py b/xls2ddl/json2ddl.py new file mode 100644 index 0000000..9978e30 --- /dev/null +++ b/xls2ddl/json2ddl.py @@ -0,0 +1,71 @@ +# -*- coding:utf-8 -*- +import sys +import io +import sys +from traceback import print_exc + +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 +from xls2ddl.xlsxData import CRUDData, xlsxFactory + +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) + if data is None: + print(xlsfile, 'not data return') + return + tmpl = tmpls.get(dbtype.lower()) + if tmpl is None: + raise Exception('%s database not implemented' % dbtype) + e = MyTemplateEngine([]) + s = e.renders(tmpl,data) + return s + +def model2ddl(folder,dbtype): + ddl_str = '' + for f in listFile(folder, suffixs=['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 + +def main(): + ##解决windows 终端中输出中文出现 + # UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 20249 + # 错误 + # BEGIN + # sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') + sys.stdout.reconfigure(encoding='utf-8') + # + # 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) + +if __name__ == '__main__': + main() + diff --git a/xls2ddl/xls2crud.py b/xls2ddl/xls2crud.py index 1d7522f..0f02ebe 100644 --- a/xls2ddl/xls2crud.py +++ b/xls2ddl/xls2crud.py @@ -23,7 +23,7 @@ usage: xls2crud.py dbname models_dir uidir """ -def build_dbdesc(models_dir: str) -> dict: +def build_dbdesc(models_dir: list) -> dict: print(f'{models_dir=}') mdirs = [] if isinstance(models_dir, list): @@ -38,6 +38,12 @@ def build_dbdesc(models_dir: str) -> dict: d = x.get_data() tbname = d.summary[0].name db_desc.update({tbname:d}) + for f in listFile(models_dir, suffixs=['.json']): + print(f'{f} handle ...') + with codecs.open(f, 'r', 'utf-8') as fh: + d = json.load(fh) + tbname = d['summary'][0]['name'] + db_desc.update({tbname:d}) return db_desc def subtable2toolbar(desc):