buildz 0.6.33__tar.gz → 0.6.35__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {buildz-0.6.33/buildz.egg-info → buildz-0.6.35}/PKG-INFO +3 -1
- {buildz-0.6.33 → buildz-0.6.35}/README.md +2 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/__init__.py +1 -1
- buildz-0.6.35/buildz/db/__init__.py +4 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/basez.py +78 -14
- buildz-0.6.35/buildz/db/dv/mysqlz.py +73 -0
- buildz-0.6.35/buildz/db/dv/oraclez.py +94 -0
- buildz-0.6.35/buildz/db/dv/orm.py +194 -0
- buildz-0.6.35/buildz/db/dv/sqlite3z.py +105 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/structz.py +21 -4
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/runz.py +27 -17
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/tls.py +2 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/dirz.py +6 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/__init__.py +2 -2
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/listmapz.py +22 -1
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/mapz.py +11 -5
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/readz.py +23 -8
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/write.py +18 -6
- buildz-0.6.35/buildz/xf/writer/deal/listmapz.py +51 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/mg.py +13 -1
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/xargs.py +1 -1
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/trs.py +2 -0
- {buildz-0.6.33 → buildz-0.6.35/buildz.egg-info}/PKG-INFO +3 -1
- {buildz-0.6.33 → buildz-0.6.35}/buildz.egg-info/SOURCES.txt +1 -0
- {buildz-0.6.33 → buildz-0.6.35}/setup.py +1 -1
- buildz-0.6.33/buildz/db/__init__.py +0 -2
- buildz-0.6.33/buildz/db/dv/mysqlz.py +0 -40
- buildz-0.6.33/buildz/db/dv/oraclez.py +0 -61
- buildz-0.6.33/buildz/db/dv/orm.py +0 -36
- buildz-0.6.33/buildz/db/dv/sqlite3z.py +0 -41
- {buildz-0.6.33 → buildz-0.6.35}/LICENSE +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/MANIFEST.in +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/__main__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/argx.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/__init__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/cache.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/config.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/dbs.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/deal.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/deal_list.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/deal_type.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/defs.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/factory.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/init.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/log.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/request.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/run.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/save.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/cache/cache.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/config/base.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/config/config.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/data/fp.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/data/item1.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/data/item2.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/data/test.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/test.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/xtest.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/verify.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/base.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/cmd.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/__main__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/__init__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/clickhousez.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/lib/readme +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/postgresqlz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/install.txt +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/db/run.conf +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/ioc/deal.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/ioc/help.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/myers/deal.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/myers/help.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/ioc.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/main.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/myers.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/search.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/xf.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/default.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/ioc.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/myers.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/search.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/xf.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/test.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/search/deal.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/search/help.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/test.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/xf/deal.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/xf/help.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/__init__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/fhs.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/fio.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/lsf.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/html/__init__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/html/test/demo.html +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/html/test/test.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/html/xml.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/__init__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/base.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/init.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/base.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/conf.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/confs.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/decorator.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/single.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/base.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/branch.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/call.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/calls.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/branch_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/call_defaults.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/call_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/calls_defaults.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/calls_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/deal_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/deals.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/env_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/ioc_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/iocf_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/join_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/list_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/map_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/mcall_defaults.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/mcall_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/obj_cst_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/obj_defaults.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/obj_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/obj_set_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/ovar_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/ref_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/refs_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/var_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/xfile_defaults.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/xfile_lists.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/deal.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/demo.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/env.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/init.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/ioc.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/iocf.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/join.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/list.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/map.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/mcall.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/obj.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/ovar.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/ref.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/refs.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/val.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/var.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/xfile.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/wrap.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/logz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/pyz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tools.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/__init__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/myers_diff.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/test_xfind.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/time/__init__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/time/timez.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/__init__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/base.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/getch.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/lx.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/test.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/win.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/xfind.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/__main__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/code.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/code_modify.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/copy_old.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/file.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/base.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/buffer.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/listz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/lr.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/lrval.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/mapz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/nextz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/reval.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/setz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/spc.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/spt.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/strz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/exp.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/item.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/mg.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/pos.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/base.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/buffer.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/listz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/lr.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/lrval.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/mapz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/nextz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/reval.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/setz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/spc.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/spt.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/strz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/strz_new.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/strz_old.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/exp.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/item.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/mg.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/pos.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/test.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/test1.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/read.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/stack.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/base.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/conf.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/jsonval.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/listz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/mapz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/reval.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/strz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/itemz.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/__init__.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/conf.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/data.js +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/test.py +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz.egg-info/dependency_links.txt +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/buildz.egg-info/top_level.txt +0 -0
- {buildz-0.6.33 → buildz-0.6.35}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: buildz
|
3
|
-
Version: 0.6.
|
3
|
+
Version: 0.6.35
|
4
4
|
Summary: 配置读写(基于json格式进行简化)、ioc、以及其他工具代码。a json-base file format's read and write code by python, and codes to read and product object from configure file in such format(ioc), and other tool codes
|
5
5
|
Home-page: https://github.com/buildCodeZ/buildz
|
6
6
|
Author: Zzz
|
@@ -34,6 +34,8 @@ License-File: LICENSE
|
|
34
34
|
运行python -m buildz查看帮助
|
35
35
|
|
36
36
|
持续更新中。。。
|
37
|
+
2024/12/18:
|
38
|
+
增加数据映射xz,数据库db增加类似orm功能以及表和索引结构查询功能(目前只写了mysql,oracle,sqlite3的查询),配置文件读写xf的输出增加对ListMap的支持(dumpx, dumpxf)
|
37
39
|
2024/11/11:
|
38
40
|
新增buildz.tz.xfind,对json做查询用的,功能类似jsonpath,自己实现的原因是好玩,以及不想为了用jsonpath去学对应的语法
|
39
41
|
2024/10/08:
|
@@ -21,6 +21,8 @@
|
|
21
21
|
运行python -m buildz查看帮助
|
22
22
|
|
23
23
|
持续更新中。。。
|
24
|
+
2024/12/18:
|
25
|
+
增加数据映射xz,数据库db增加类似orm功能以及表和索引结构查询功能(目前只写了mysql,oracle,sqlite3的查询),配置文件读写xf的输出增加对ListMap的支持(dumpx, dumpxf)
|
24
26
|
2024/11/11:
|
25
27
|
新增buildz.tz.xfind,对json做查询用的,功能类似jsonpath,自己实现的原因是好玩,以及不想为了用jsonpath去学对应的语法
|
26
28
|
2024/10/08:
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import sys
|
2
2
|
from .structz import ItDv
|
3
3
|
from buildz.db import tls
|
4
|
+
from buildz import xf
|
4
5
|
def sp(obj):
|
5
6
|
return super(obj.__class__, obj)
|
6
7
|
|
@@ -9,21 +10,71 @@ class SimpleDv(ItDv):
|
|
9
10
|
# func to impl:
|
10
11
|
def to_list(self, query_result):
|
11
12
|
return []
|
12
|
-
def sql_tables(self):
|
13
|
-
|
13
|
+
def sql_tables(self, table = None):
|
14
|
+
"""
|
15
|
+
if not note, use name instead
|
16
|
+
require:
|
17
|
+
table_name, table_note
|
18
|
+
"""
|
19
|
+
raise Exception("unimplement")
|
20
|
+
return None
|
21
|
+
def sql_columns(self, table):
|
22
|
+
"""
|
23
|
+
require:
|
24
|
+
table_name, column_name, column_type, column_default, nullable, column_offset, column_note
|
25
|
+
"""
|
26
|
+
raise Exception("unimplement")
|
27
|
+
return None
|
28
|
+
def sql_indexes(self, table=None):
|
29
|
+
"""
|
30
|
+
require:
|
31
|
+
table_name, index_name, is_unique, index_type, index_note
|
32
|
+
"""
|
33
|
+
raise Exception("unimplement")
|
34
|
+
return None
|
35
|
+
def sql_index_keys(self, table, index):
|
36
|
+
"""
|
37
|
+
require:
|
38
|
+
table_name, index_name, column_name, index_offset, column_note
|
39
|
+
"""
|
40
|
+
raise Exception("unimplement")
|
41
|
+
return None
|
14
42
|
def new_con(self):
|
15
43
|
return None
|
16
44
|
def new_cursor(self):
|
17
45
|
return None
|
18
46
|
def init(self, *argv, **maps):
|
19
47
|
pass
|
48
|
+
def tables(self, table=None, as_map=None):
|
49
|
+
sql = self.sql_tables(table)
|
50
|
+
return self.query(sql, as_map=as_map)
|
51
|
+
def columns(self, table, as_map=None):
|
52
|
+
sql = self.sql_columns(table)
|
53
|
+
return self.query(sql, as_map=as_map)
|
54
|
+
def indexes(self, table=None, index=None, as_map=None):
|
55
|
+
sql = self.sql_indexes(table, index)
|
56
|
+
return self.query(sql, as_map=as_map)
|
57
|
+
def index_keys(self, table, index, as_map=None):
|
58
|
+
sql = self.sql_index_keys(table, index)
|
59
|
+
return self.query(sql, as_map=as_map)
|
20
60
|
# func already impl
|
21
61
|
def check_query(self, s):
|
22
62
|
arr = s.split(" ")
|
23
63
|
k = arr[0].strip().lower()
|
24
|
-
rst = k not in "delete,insert,update,create,drop,commit".split(",")
|
64
|
+
rst = k not in "delete,insert,update,create,drop,commit,alter".split(",")
|
65
|
+
return rst
|
66
|
+
def out_list(self, query_result, as_map=None):
|
67
|
+
if as_map is None:
|
68
|
+
as_map = self.as_map
|
69
|
+
rst = self.to_list(query_result)
|
70
|
+
if as_map and len(rst)>0:
|
71
|
+
if len(rst)==1:
|
72
|
+
return []
|
73
|
+
keys = rst[0]
|
74
|
+
rst = rst[1:]
|
75
|
+
rst = [{k:v for k,v in zip(keys, dt)} for dt in rst]
|
25
76
|
return rst
|
26
|
-
def __init__(self, host, port, user, pwd, db, *argv, **maps):
|
77
|
+
def __init__(self, host, port, user, pwd, db, as_map=False, *argv, **maps):
|
27
78
|
self.host = host
|
28
79
|
self.port = port
|
29
80
|
self.user = user
|
@@ -31,10 +82,13 @@ class SimpleDv(ItDv):
|
|
31
82
|
self.db = db
|
32
83
|
self.con = None
|
33
84
|
self.cursor = None
|
85
|
+
self.as_map = as_map
|
34
86
|
self.init(*argv, **maps)
|
35
87
|
def begin(self):
|
36
88
|
self.con = self.new_con()
|
37
89
|
self.cursor = self.new_cursor()
|
90
|
+
def open(self):
|
91
|
+
self.begin()
|
38
92
|
def close(self):
|
39
93
|
self.cursor.close()
|
40
94
|
self.con.close()
|
@@ -49,14 +103,23 @@ class SimpleDv(ItDv):
|
|
49
103
|
def refresh(self):
|
50
104
|
self.cursor.close()
|
51
105
|
self.cursor = self.new_cursor()
|
52
|
-
def query(self, sql, vals=()):
|
106
|
+
def query(self, sql, vals=(), as_map = None):
|
53
107
|
# return list, first row is key
|
54
108
|
tmp = self.cursor.execute(sql, vals)
|
55
109
|
#print("[TESTZ] exe:",tmp)
|
56
110
|
rst = self.cursor.fetchall()
|
57
|
-
return self.
|
58
|
-
def
|
111
|
+
return self.out_list(rst, as_map)
|
112
|
+
def executes(self, sqls, commit=False):
|
113
|
+
if type(sqls)==str:
|
114
|
+
sqls = sqls.split(";")
|
115
|
+
sqls = [sql.strip() for sql in sqls if sql.strip()!=""]
|
116
|
+
_ = [self.execute(sql) for sql in sqls]
|
117
|
+
if commit:
|
118
|
+
self.execute("commit;")
|
119
|
+
def execute(self, sql, vals=(), commit=False):
|
59
120
|
tmp = self.cursor.execute(sql, vals)
|
121
|
+
if commit:
|
122
|
+
self.cursor.execute("commit;")
|
60
123
|
return tmp
|
61
124
|
def insert_or_update(self, maps, table, keys = None):
|
62
125
|
if type(maps)!=dict:
|
@@ -77,7 +140,7 @@ class SimpleDv(ItDv):
|
|
77
140
|
v = maps[k]
|
78
141
|
if type(v)==str:
|
79
142
|
v = f"'{v}'"
|
80
|
-
if v not
|
143
|
+
if v is not None:
|
81
144
|
cond = f"{k} = {v}"
|
82
145
|
else:
|
83
146
|
cond = f"{k} is null"
|
@@ -85,25 +148,25 @@ class SimpleDv(ItDv):
|
|
85
148
|
if need_query:
|
86
149
|
conds = " and ".join(conds)
|
87
150
|
sql_search = f"select count(*) from {table} where {conds}"
|
88
|
-
rst = self.query(sql_search)[1][0]
|
151
|
+
rst = self.query(sql_search, as_map = False)[1][0]
|
89
152
|
update = rst>0
|
90
153
|
if update:
|
91
154
|
keys = set(keys)
|
92
155
|
kvs = [[k,tls.py2sql(v)] for k,v in maps.items() if k not in keys]
|
93
|
-
sets = [f"{k}={v}"]
|
156
|
+
sets = [f"{k}={v}" for k,v in kvs]
|
94
157
|
sets = ",".join(sets)
|
95
158
|
sql = f"update {table} set {sets} where {conds}"
|
96
159
|
else:
|
97
|
-
kvs = [k, tls.py2sql(v) for k,v in maps.items()]
|
160
|
+
kvs = [[k, tls.py2sql(v)] for k,v in maps.items()]
|
98
161
|
ks = ",".join([kv[0] for kv in kvs])
|
99
|
-
vs = ",".join([kv[1] for kv in kvs])
|
162
|
+
vs = ",".join([str(kv[1]) for kv in kvs])
|
100
163
|
sql = f"insert into {table}({ks}) values({vs});"
|
101
164
|
return self.execute(sql)
|
102
165
|
|
103
166
|
pass
|
104
167
|
|
105
168
|
# user|pwd@host:port/db
|
106
|
-
def fetch(args):
|
169
|
+
def fetch(args, conf={}):
|
107
170
|
"""
|
108
171
|
host[:port][/db][ user][ pwd]
|
109
172
|
host:port/db user pwd
|
@@ -133,6 +196,7 @@ def fetch(args):
|
|
133
196
|
pwd = args[2]
|
134
197
|
if pwd is not None:
|
135
198
|
pwd = pwd.strip()
|
136
|
-
|
199
|
+
as_map = xf.g(conf, as_map=False)
|
200
|
+
return host, port, user, pwd, db, as_map
|
137
201
|
|
138
202
|
pass
|
@@ -0,0 +1,73 @@
|
|
1
|
+
try:
|
2
|
+
import pymysql
|
3
|
+
except ModuleNotFoundError:
|
4
|
+
raise Exception("module not found, try: pip install pymysql")
|
5
|
+
import sys
|
6
|
+
from .basez import SimpleDv, fetch
|
7
|
+
from .structz import CMD
|
8
|
+
class Db(SimpleDv):
|
9
|
+
# func to impl:
|
10
|
+
def to_list(self, rst):
|
11
|
+
result = []
|
12
|
+
if rst is None or len(rst)==0:
|
13
|
+
return result
|
14
|
+
a = rst[0]
|
15
|
+
keys = list(a.keys())
|
16
|
+
result.append(keys)
|
17
|
+
for obj in rst:
|
18
|
+
v = [obj[k] for k in keys]
|
19
|
+
result.append(v)
|
20
|
+
return result
|
21
|
+
def new_con(self):
|
22
|
+
return pymysql.connect(host=self.host,
|
23
|
+
port = self.port, user =self.user,
|
24
|
+
password =self.pwd, database = self.db,
|
25
|
+
charset='utf8',init_command="SET SESSION time_zone='+08:00'")
|
26
|
+
def new_cursor(self):
|
27
|
+
return self.con.cursor(pymysql.cursors.DictCursor)
|
28
|
+
def init(self, *argv, **maps):
|
29
|
+
if self.port is None:
|
30
|
+
self.port = 3306
|
31
|
+
pass
|
32
|
+
def sql_tables(self, table = None):
|
33
|
+
"""
|
34
|
+
if not note, use name instead
|
35
|
+
require:
|
36
|
+
table_name, table_note
|
37
|
+
"""
|
38
|
+
query_table = ""
|
39
|
+
if table is not None:
|
40
|
+
query_table = f" and table_name = '{table}'"
|
41
|
+
return f"select table_name, table_comment as table_note from information_schema.tables where table_schema='{self.db}' {query_table};"
|
42
|
+
def sql_columns(self, table):
|
43
|
+
"""
|
44
|
+
require:
|
45
|
+
table_name, column_name, column_type, column_default, nullable, column_offset, column_note
|
46
|
+
"""
|
47
|
+
return f"select table_name, column_name, column_type, column_default, is_nullable as nullable, ordinal_position as column_offset, column_comment as column_note from information_schema.columns where table_schema='{self.db}' and table_name = '{table}' order by ordinal_position asc;"
|
48
|
+
def sql_indexes(self, table=None, index=None):
|
49
|
+
"""
|
50
|
+
require:
|
51
|
+
table_name, index_name, is_unique, index_type, index_note
|
52
|
+
"""
|
53
|
+
query_table = ""
|
54
|
+
if table is not None:
|
55
|
+
query_table = f" and table_name = '{table}'"
|
56
|
+
if index is not None:
|
57
|
+
query_table+= f" and index_name='{index}'"
|
58
|
+
return f"select table_name, index_name, 1-any_value(non_unique) as is_unique, any_value(index_type) as index_type, any_value(index_comment) as index_note from information_schema.statistics where table_schema='{self.db}' {query_table} group by index_name;"
|
59
|
+
def sql_index_keys(self, table, index):
|
60
|
+
"""
|
61
|
+
require:
|
62
|
+
table_name, index_name, column_name, index_offset, column_note
|
63
|
+
"""
|
64
|
+
return f"select table_name, index_name, column_name, seq_in_index as index_offset, comment as column_note from information_schema.statistics where table_name='{table}' and table_schema='{self.db}' and index_name = '{index}' order by seq_in_index asc;"
|
65
|
+
|
66
|
+
pass
|
67
|
+
def build(argv, conf):
|
68
|
+
dv = Db(*fetch(argv))
|
69
|
+
return dv
|
70
|
+
def buildbk(argv, conf):
|
71
|
+
return CMD(make(argv, conf))
|
72
|
+
|
73
|
+
pass
|
@@ -0,0 +1,94 @@
|
|
1
|
+
|
2
|
+
import os
|
3
|
+
import sys
|
4
|
+
dp = os.path.dirname(__file__)
|
5
|
+
gdp = os.path.join(dp, "lib")
|
6
|
+
|
7
|
+
def init_path(dp):
|
8
|
+
path = os.environ["PATH"]
|
9
|
+
if sys.platform.lower().find("win")>=0:
|
10
|
+
cb = ";"
|
11
|
+
else:
|
12
|
+
cb = ":"
|
13
|
+
path = path +cb+dp
|
14
|
+
os.environ["PATH"] = path
|
15
|
+
|
16
|
+
pass
|
17
|
+
|
18
|
+
#init_path(dp)
|
19
|
+
import sys
|
20
|
+
from .basez import SimpleDv, fetch
|
21
|
+
from .structz import CMD
|
22
|
+
class Db(SimpleDv):
|
23
|
+
# func to impl:
|
24
|
+
def to_list(self, rst):
|
25
|
+
rows = self.cursor.description
|
26
|
+
keys = [k[0].lower() for k in rows]
|
27
|
+
result = []
|
28
|
+
result.append(keys)
|
29
|
+
if rst is None or len(rst)==0:
|
30
|
+
return result
|
31
|
+
result += rst
|
32
|
+
return result
|
33
|
+
def new_con(self):
|
34
|
+
if self.port is not None:
|
35
|
+
add = ":"+str(self.port)
|
36
|
+
else:
|
37
|
+
add = ""
|
38
|
+
try:
|
39
|
+
import cx_Oracle as pymysql
|
40
|
+
except ModuleNotFoundError:
|
41
|
+
raise Exception("module not found, try: pip install cx-Oracle")
|
42
|
+
return pymysql.connect(self.user, self.pwd, self.host+add+"/"+self.db)
|
43
|
+
def new_cursor(self):
|
44
|
+
return self.con.cursor()
|
45
|
+
def init(self, *argv, **maps):
|
46
|
+
pass
|
47
|
+
def sql_tables(self, table = None):
|
48
|
+
"""
|
49
|
+
if not note, use name instead
|
50
|
+
require:
|
51
|
+
table_name, table_note
|
52
|
+
"""
|
53
|
+
query_table = ""
|
54
|
+
if table is not None:
|
55
|
+
query_table = f" and t.table_name = '{table.upper()}'"
|
56
|
+
return f"select t.table_name as table_name, tc.comments as table_note from all_tables t inner join all_tab_comments tc on t.table_name=tc.table_name where t.owner='{self.user.upper()}' {query_table}"
|
57
|
+
def sql_columns(self, table):
|
58
|
+
"""
|
59
|
+
require:
|
60
|
+
table_name, column_name, column_type, column_default, nullable, column_offset, column_note
|
61
|
+
"""
|
62
|
+
return f"select c.table_name as table_name, c.column_name as column_name, c.data_type|| '(' ||c.data_length||','||c.data_precision||','||c.data_scale||')' as column_type, c.data_default as column_default, c.nullable as nullable, c.column_id as column_offset, cc.comments as column_note from all_tab_columns c inner join all_col_comments cc on c.column_name=cc.column_name and c.table_name=cc.table_name where c.table_name='{table.upper()}' order by c.column_id asc"
|
63
|
+
def sql_indexes(self, table=None, index=None):
|
64
|
+
"""
|
65
|
+
require:
|
66
|
+
table_name, index_name, is_unique, index_type, index_note
|
67
|
+
"""
|
68
|
+
query_table = ""
|
69
|
+
if table is not None:
|
70
|
+
query_table = f" and table_name = '{table.upper()}'"
|
71
|
+
if index is not None:
|
72
|
+
query_table+= f" and index_name='{index.upper()}'"
|
73
|
+
return f"select table_name, index_name, case uniqueness when 'UNIQUE' then 1 else 0 end as is_unique, index_type, '' as index_note from all_indexes where owner = '{self.user.upper()}'{query_table}"
|
74
|
+
def sql_index_keys(self, table, index):
|
75
|
+
"""
|
76
|
+
require:
|
77
|
+
table_name, index_name, column_name, index_offset, column_note
|
78
|
+
"""
|
79
|
+
return f"select table_name, index_name, column_name, column_position as index_offset, '' as note from all_ind_columns where index_name='{index.upper()}' and table_name='{table.upper()}' order by column_position asc"
|
80
|
+
|
81
|
+
pass
|
82
|
+
def build(argv, conf):
|
83
|
+
k = 'oracle_lib'
|
84
|
+
dp = gdp
|
85
|
+
if k in conf:
|
86
|
+
dp = conf[k]
|
87
|
+
init_path(dp)
|
88
|
+
#print(f"oracle lib: {dp}")
|
89
|
+
dv = Db(*fetch(argv))
|
90
|
+
return dv
|
91
|
+
def buildbk(argv, conf):
|
92
|
+
return CMD(make(argv, conf))
|
93
|
+
|
94
|
+
pass
|
@@ -0,0 +1,194 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
from buildz import Base
|
4
|
+
from buildz.db import tls
|
5
|
+
from buildz import xf
|
6
|
+
def dict2list(data):
|
7
|
+
rst = []
|
8
|
+
for k,v in data.items():
|
9
|
+
if type(v) not in (list, tuple):
|
10
|
+
v = [v]
|
11
|
+
tmp = [k]+list(v)
|
12
|
+
rst.append(tmp)
|
13
|
+
return rst
|
14
|
+
def deal_item(item, conf):
|
15
|
+
key = item[0]
|
16
|
+
if key in "sql_before,sql_after,sql_delete_before,sql_delete_after".split(","):
|
17
|
+
conf[key].append(item[1])
|
18
|
+
else:
|
19
|
+
conf[key] = item[1]
|
20
|
+
def deal_key(it, conf):
|
21
|
+
data_keys = xf.g(conf, data_keys=[])
|
22
|
+
tmp = {}
|
23
|
+
for i in range(min(len(it), len(data_keys))):
|
24
|
+
tmp[data_keys[i]] = it[i]
|
25
|
+
sql_key = tmp['sql_key']
|
26
|
+
sql_def = tmp['sql_def']
|
27
|
+
py_key = xf.g(tmp, py_key=None)
|
28
|
+
if py_key is not None:
|
29
|
+
xf.g(conf, py2sqls={})[py_key] = sql_key
|
30
|
+
xf.g(conf, keys=[]).append(sql_key)
|
31
|
+
xf.g(conf, vars=[]).append(sql_key+" "+sql_def)
|
32
|
+
def makes(datas, data_keys = "sql_key,sql_def,py_key".split(",")):
|
33
|
+
if type(datas)==dict:
|
34
|
+
rst = [make(v, k) for k,v in datas.items()]
|
35
|
+
else:
|
36
|
+
rst = [make(it) for it in datas]
|
37
|
+
return rst
|
38
|
+
def make(data, table=None, data_keys = "sql_key,sql_def,py_key".split(",")):
|
39
|
+
"""
|
40
|
+
从配置中生成建表语句,删表语句和orm对象
|
41
|
+
输入:
|
42
|
+
data: dict or list
|
43
|
+
dict: {
|
44
|
+
(其他配置)
|
45
|
+
(其他配置)
|
46
|
+
表字段: [sql字段定义, 转py后字段名]
|
47
|
+
表字段: sql字段定义
|
48
|
+
}
|
49
|
+
list: [
|
50
|
+
((其他配置))
|
51
|
+
((其他配置))
|
52
|
+
[表字段, sql字段定义, 转py后字段名]
|
53
|
+
[表字段, sql字段定义]
|
54
|
+
]
|
55
|
+
其他配置:
|
56
|
+
格式: key, val
|
57
|
+
key:
|
58
|
+
table: 表名
|
59
|
+
query_keys: 默认null,orm做插入/更新时,判断数据是插入还是更新的查询方式
|
60
|
+
auto_translate: 默认true,如果没有配置“转py后字段名”,是否自动转(a_b=>aB)
|
61
|
+
sql_before: 新增一条建表前sql语句
|
62
|
+
sql_after: 新增一条建表后sql语句
|
63
|
+
sql_delete_before: 新增一条删表前sql语句
|
64
|
+
sql_delete_after: 新增一条删表后sql语句
|
65
|
+
data_keys: 默认[sql_key, sql_def, py_key],非配置项怎么解析,不建议改
|
66
|
+
table: 表名
|
67
|
+
输出:
|
68
|
+
[[sql_create, sql_delete], orm_obj]
|
69
|
+
"""
|
70
|
+
if xf.is_args(data):
|
71
|
+
confs = data.lists
|
72
|
+
confs =[[it] for it in confs]
|
73
|
+
data = dict2list(data.maps)
|
74
|
+
data = confs+data
|
75
|
+
elif type(data) == dict:
|
76
|
+
data = dict2list(data)
|
77
|
+
conf = {}
|
78
|
+
xf.s(conf, sql_before = [], sql_after = [], sql_delete_before=[], sql_delete_after=[],auto_translate=True,table=table,keys=[],py2sqls={},query_keys=None, data_keys = data_keys, vars=[])
|
79
|
+
for it in data:
|
80
|
+
if len(it)==1 and type(it[0]) in (list, tuple):
|
81
|
+
deal_item(it[0], conf)
|
82
|
+
else:
|
83
|
+
deal_key(it, conf)
|
84
|
+
table = xf.g(conf, table=table)
|
85
|
+
vars = xf.g(conf, vars = [])
|
86
|
+
vars = ",".join(vars)
|
87
|
+
assert table is not None
|
88
|
+
sql = f"create table if not exists {table}({vars})"
|
89
|
+
sql_del = f"drop table if exists {table}"
|
90
|
+
sqls = xf.g(conf, sql_before=[], sql_after=[], sql_delete_before=[], sql_delete_after=[])
|
91
|
+
#sqls = [";".join(k) for k in sqls]
|
92
|
+
sqls_crt = sqls[0]+[sql]+sqls[1]
|
93
|
+
sqls_del = sqls[2]+[sql_del]+sqls[3]
|
94
|
+
sqls = [sqls_crt, sqls_del]
|
95
|
+
sqls = [(";\n".join(k)+";").replace(";;",";") for k in sqls]
|
96
|
+
obj = TableObject(*xf.g(conf, keys=[], table=table, py2sqls = None, query_keys=None,auto_translate=True), sql_create = sqls[0], sql_delete = sqls[1])
|
97
|
+
return sqls, obj
|
98
|
+
|
99
|
+
pass
|
100
|
+
|
101
|
+
class TableObject(Base):
|
102
|
+
"""
|
103
|
+
字段映射
|
104
|
+
keys: 表字段
|
105
|
+
table: 表名
|
106
|
+
py2sqls: 自定义映射
|
107
|
+
query_keys: 唯一索引(判断数据重复)
|
108
|
+
auto_translate:
|
109
|
+
对于没有在py2sqls自定义映射的表字段,是否自动转换(py|autoTran<=>auto_tran|sql)
|
110
|
+
"""
|
111
|
+
def init(self, keys, table=None, py2sqls=None, query_keys=None, auto_translate=True, dv = None, sql_create=None, sql_delete=None):
|
112
|
+
if table is None:
|
113
|
+
table = tls.lower(self.__class__.__name__)
|
114
|
+
self.table = table
|
115
|
+
if py2sqls is None:
|
116
|
+
py2sqls = {}
|
117
|
+
if type(py2sqls) in (list, tuple):
|
118
|
+
py2sqls = {k[0]:k[1] for k in py2sqls}
|
119
|
+
sql2pys = {}
|
120
|
+
for k_py, k_sql in py2sqls.items():
|
121
|
+
sql2pys[k_sql] = k_py
|
122
|
+
for key in keys:
|
123
|
+
if key not in sql2pys:
|
124
|
+
k_py, k_sql = key,key
|
125
|
+
if auto_translate:
|
126
|
+
k_py,k_sql = tls.upper(key), tls.lower(key)
|
127
|
+
py2sqls[k_py] = k_sql
|
128
|
+
sql2pys[k_sql] = k_py
|
129
|
+
self.py2sqls = py2sqls
|
130
|
+
self.sql2pys = sql2pys
|
131
|
+
self.keys = keys
|
132
|
+
if query_keys is None:
|
133
|
+
query_keys = []
|
134
|
+
self.query_keys = query_keys
|
135
|
+
self.dv = dv
|
136
|
+
self.py2sql=self.toSql
|
137
|
+
self.sql2py = self.toPy
|
138
|
+
self.sql_create = sql_create
|
139
|
+
self.sql_delete = sql_delete
|
140
|
+
def create(self, dv=None):
|
141
|
+
assert self.sql_create is not None
|
142
|
+
dv = self.rdv(dv)
|
143
|
+
dv.executes(self.sql_create)
|
144
|
+
def delete(self, dv=None):
|
145
|
+
assert self.sql_delete is not None
|
146
|
+
self.rdv(dv).execute(self.sql_delete)
|
147
|
+
def bind(self, dv):
|
148
|
+
self.dv = dv
|
149
|
+
def toSql(self, obj):
|
150
|
+
if type(obj)!=dict:
|
151
|
+
tmp = {}
|
152
|
+
for k in self.py2sqls:
|
153
|
+
if hasattr(obj, k):
|
154
|
+
tmp[k] = getattr(obj, k)
|
155
|
+
obj = tmp
|
156
|
+
obj = {self.py2sqls[k]:v for k,v in obj.items()}
|
157
|
+
return obj
|
158
|
+
def toPy(self, obj):
|
159
|
+
if type(obj)!=dict:
|
160
|
+
tmp = {}
|
161
|
+
for k in self.sql2pys:
|
162
|
+
if hasattr(obj, k):
|
163
|
+
tmp[k] = getattr(obj, k)
|
164
|
+
obj = tmp
|
165
|
+
obj = {self.sql2pys[k]:v for k,v in obj.items()}
|
166
|
+
return obj
|
167
|
+
def rdv(self, dv):
|
168
|
+
if dv is None:
|
169
|
+
dv = self.dv
|
170
|
+
assert dv is not None
|
171
|
+
return dv
|
172
|
+
def query(self, sql, dv=None, sql2py=True):
|
173
|
+
dv=self.rdv(dv)
|
174
|
+
rst = dv.query(sql, as_map=1)
|
175
|
+
if sql2py:
|
176
|
+
rst = [self.sql2py(it) for it in rst]
|
177
|
+
return rst
|
178
|
+
def queryAll(self, dv=None, sql2py=True):
|
179
|
+
sql = f"select * from {self.table};"
|
180
|
+
return self.query(sql, dv, sql2py)
|
181
|
+
def save(self, obj, dv=None, py2sql = True, commit=False, check = True):
|
182
|
+
dv = self.rdv(dv)
|
183
|
+
if type(obj) not in [list, tuple]:
|
184
|
+
obj = [obj]
|
185
|
+
if py2sql:
|
186
|
+
obj = [self.toSql(k) for k in obj]
|
187
|
+
query_keys = self.query_keys
|
188
|
+
if not check:
|
189
|
+
query_keys = None
|
190
|
+
_ = [dv.insert_or_update(k, self.table, query_keys) for k in obj]
|
191
|
+
if commit:
|
192
|
+
dv.execute("commit;")
|
193
|
+
return _
|
194
|
+
|
@@ -0,0 +1,105 @@
|
|
1
|
+
|
2
|
+
import sqlite3
|
3
|
+
import sys,os
|
4
|
+
from .basez import SimpleDv, fetch
|
5
|
+
from .structz import CMD
|
6
|
+
from buildz import xf,fz
|
7
|
+
class Db(SimpleDv):
|
8
|
+
# func to impl:
|
9
|
+
def to_list(self, rst):
|
10
|
+
rows = self.cursor.description
|
11
|
+
keys = [k[0].lower() for k in rows]
|
12
|
+
result = []
|
13
|
+
result.append(keys)
|
14
|
+
if rst is None or len(rst)==0:
|
15
|
+
return result
|
16
|
+
result += rst
|
17
|
+
return result
|
18
|
+
def new_con(self):
|
19
|
+
return sqlite3.connect(self.fp)
|
20
|
+
def new_cursor(self):
|
21
|
+
return self.con.cursor()
|
22
|
+
def __init__(self, fp, as_map=False, *argv, **maps):
|
23
|
+
#def __init__(self, fp):
|
24
|
+
self.con = None
|
25
|
+
self.cursor = None
|
26
|
+
self.as_map = as_map
|
27
|
+
self.init(fp)
|
28
|
+
def init(self, fp):
|
29
|
+
fz.makefdir(fp)
|
30
|
+
self.fp = fp
|
31
|
+
def sql_tables(self, table = None):
|
32
|
+
"""
|
33
|
+
if not note, use name instead
|
34
|
+
require:
|
35
|
+
table_name, table_note
|
36
|
+
"""
|
37
|
+
query_table = ""
|
38
|
+
if table is not None:
|
39
|
+
query_table = f" and name = '{table}'"
|
40
|
+
return f"select name as table_name, '' as table_note from sqlite_master where type='table' {query_table};"
|
41
|
+
def sql_indexes(self, table=None, index=None):
|
42
|
+
"""
|
43
|
+
require:
|
44
|
+
table_name, index_name, is_unique, index_type, index_note
|
45
|
+
"""
|
46
|
+
query_table = ""
|
47
|
+
if table is not None:
|
48
|
+
query_table = f" and tbl_name = '{table}'"
|
49
|
+
if index is not None:
|
50
|
+
query_table+= f" and name='{index}'"
|
51
|
+
return f"select tbl_name as table_name, name as index_name, -1 as is_unique, '?' as index_type, '' as index_note from sqlite_master where type='index' {query_table};"
|
52
|
+
def columns(self, table, as_map=None):
|
53
|
+
"""
|
54
|
+
require:
|
55
|
+
table_name, column_name, column_type, column_default, nullable, column_offset, column_note
|
56
|
+
"""
|
57
|
+
rst = self.query(f"PRAGMA table_info({table})", as_map=0)
|
58
|
+
dts = rst[1:]
|
59
|
+
keys = "table_name, column_name, column_type, column_default, nullable, column_offset, column_note".split(", ")
|
60
|
+
rst = [keys]
|
61
|
+
for dt in dts:
|
62
|
+
cid, name, _type, notnull, dflt_value, pk = dt
|
63
|
+
tmp = [table, name, _type, dflt_value, notnull, cid, '']
|
64
|
+
rst.append(tmp)
|
65
|
+
rst = self.out_list_sqlite3(rst, as_map)
|
66
|
+
return rst
|
67
|
+
def index_keys(self, table, index, as_map=None):
|
68
|
+
"""
|
69
|
+
require:
|
70
|
+
table_name, index_name, column_name, index_offset, column_note
|
71
|
+
"""
|
72
|
+
rst = self.query(f"PRAGMA index_info({index})", as_map=0)
|
73
|
+
dts = rst[1:]
|
74
|
+
keys = "table_name, index_name, column_name, index_offset, column_note".split(", ")
|
75
|
+
rst = [keys]
|
76
|
+
for dt in dts:
|
77
|
+
seqno, cid, name = dt
|
78
|
+
tmp = [table, index, name, seqno, '']
|
79
|
+
rst.append(tmp)
|
80
|
+
return self.out_list_sqlite3(rst, as_map)
|
81
|
+
def out_list_sqlite3(self, query_result, as_map=None):
|
82
|
+
if as_map is None:
|
83
|
+
as_map = self.as_map
|
84
|
+
rst = query_result
|
85
|
+
if as_map and len(rst)>0:
|
86
|
+
if len(rst)==1:
|
87
|
+
return []
|
88
|
+
keys = rst[0]
|
89
|
+
rst = rst[1:]
|
90
|
+
rst = [{k:v for k,v in zip(keys, dt)} for dt in rst]
|
91
|
+
return rst
|
92
|
+
|
93
|
+
pass
|
94
|
+
def build(argv, conf):
|
95
|
+
root = xf.g(conf, root=None)
|
96
|
+
fp = argv[0]
|
97
|
+
if root is not None:
|
98
|
+
fp = os.path.join(root, fp)
|
99
|
+
as_map = xf.g(conf, as_map=False)
|
100
|
+
dv = Db(fp, as_map)
|
101
|
+
return dv
|
102
|
+
def buildbk(argv, conf):
|
103
|
+
return CMD(make(argv, conf))
|
104
|
+
|
105
|
+
pass
|