生成可接受Python数据的SQL DDL
项目描述
从表数据推断SQL DDL(数据定义语言)。
在命令行使用
$ ddlgenerator -i postgresql '[{"Name": "Alfred", "species": "wart hog", "kg": 22}]' DROP TABLE generated_table; CREATE TABLE generated_table ( name VARCHAR(6) NOT NULL, kg INTEGER NOT NULL, species VARCHAR(8) NOT NULL ) ; INSERT INTO generated_table (kg, Name, species) VALUES (22, 'Alfred', 'wart hog');
从文件中读取数据
$ ddlgenerator postgresql mydata.yaml > mytable.sql
允许一键创建包含数据的表
$ ddlgenerator –inserts postgresql mydata.json | psql
在Python中使用
>>> from ddlgenerator.ddlgenerator import Table >>> table = Table([{"Name": "Alfred", "species": "wart hog", "kg": 22}]) >>> sql = table.sql('postgresql', inserts=True)
支持的数据格式
纯Python
YAML
JSON
CSV
Pickle
HTML
功能
支持由SQLAlchemy支持的 所有SQL方言
将数据强制转换为所有列值上有效的最具体数据类型
从文件名中获取表名
如果未指定文件扩展名,则猜测输入数据的格式
使用 -i/--inserts 标志,添加INSERT语句
使用 -u/--uniques 标志,从数据中推断UNIQUE约束
处理嵌套数据,根据需要创建子表
读取HTML表格,包括嵌入在嘈杂网站中的表格
选项
-h, --help show this help message and exit -k KEY, --key KEY Field to use as primary key -r, --reorder Reorder fields alphabetically, ``key`` first -u, --uniques Include UNIQUE constraints where data is unique -t, --text Use variable-length TEXT columns instead of VARCHAR -d, --drops Include DROP TABLE statements -i, --inserts Include INSERT statements --no-creates Do not include CREATE TABLE statements --save-metadata-to FILENAME Save table definition in FILENAME for later --use- saved-metadata run --use-metadata-from FILENAME Use metadata saved in FROM for table definition, do not re-analyze table structure -l LOG, --log LOG log level (CRITICAL, FATAL, ERROR, DEBUG, INFO, WARN)
生成SQLAlchemy模型
使用 sqlalchemy 作为生成Python以定义SQLAlchemy模型的模型
$ ddlgenerator sqlalchemy '[{"Name": "Alfred", "species": "wart hog", "kg": 22}]' Table0 = Table('Table0', metadata, Column('species', Unicode(length=8), nullable=False), Column('kg', Integer(), nullable=False), Column('name', Unicode(length=6), nullable=False), schema=None)
生成Django模型
如果路径上安装了Django,则使用 django 作为模型将运行生成的DDL通过Django的 inspectdb 管理命令来生成模型文件
$ ddlgenerator django '[{"Name": "Alfred", "species": "wart hog", "kg": 22}]' # This is an auto-generated Django model module. # You'll have to do the following manually to clean this up: # * Rearrange models' order # * Make sure each model has one field with primary_key=True # * Remove `managed = False` lines if you wish to allow Django to create and delete the table # Feel free to rename the models, but don't rename db_table values or field names. # # Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]' # into your database. from __future__ import unicode_literals from django.db import models class Table0(models.Model): species = models.CharField(max_length=8) kg = models.IntegerField() name = models.CharField(max_length=6) class Meta: managed = False db_table = 'Table0'
大型表格
目前,当表的大小接近系统可用内存时,ddlgenerator 并未设计得很好。
为了节省大型表的时间和内存,可以将输入数据拆分为多个文件,然后使用 ddlgenerator 对一个小但具有代表性的样本运行 --save-metadata。然后使用 --no-creates 和 -use-saved-metadata 从剩余的文件中生成 INSERT,而无需每次重新确定列类型。
安装
需要 Python3。
从 PyPI 安装
pip3 install ddlgenerator
从源代码安装
git clone https://github.com/catherinedevlin/ddl-generator.git cd ddl-generator pip3 install .
替代方案
pandas.read_* 方法
SQLite 的 prequel
鸣谢
Mike Bayer 对 sqlalchemy 的贡献
coldfix 和 Mark Ransom 对他们的 StackOverflow 答案的贡献
Audrey Roy 对 cookiecutter 的贡献
Brandon Lorenz 对 Django 模型生成器的贡献
历史
0.1.0 (2014-03-22)
首次发布于 PyPI。
0.1.2 (2014-07-15)
data_dispenser 被移动到单独的模块
0.1.3 (2014-07-16)
修复了在短字符串之后找到长整数的错误
0.1.4 (2014-07-25)
修复错误:外部 data_dispenser 在 0.1.3 版本中未使用!
0.1.5 (2014-07-25)
sqlalchemy 伪方言已添加
0.1.6 (2014-07-25)
生成 sqlalchemy 插入
0.1.7 (2014-09-14)
通过 HTTP 读取
支持 HTML 格式
生成Django模型
0.1.7.1 (2014-09-14)
需要 data-dispenser 0.2.3
0.1.7.3 (2014-10-19)
为了简单起见,需要所有以前推荐的所有依赖项
修复了复数字段的一些错误
0.1.8 (2015-02-01)
在 sqlalchemy 输出中正确处理了 UNIQUE 约束
0.1.8.2 (2015-02-05)
为 fixtures 生成更干净的 SQLAlchemy
0.1.9 (2015-02-10)
来自 Anatoly Technonik 和 Mikhail Podgurskiy 的 README 修复
解析传递给 generate(args, namespace) 的参数,以用于非命令行使用
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。