跳转到主要内容

生成可接受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 .

替代方案

鸣谢

  • 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) 的参数,以用于非命令行使用

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源代码分发

ddlgenerator-0.1.9.tar.gz (26.1 kB 查看哈希)

上传时间 源代码

构建分发

ddlgenerator-0.1.9-py3.4.egg (49.5 kB 查看哈希)

上传时间 源代码

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面