如何生成各种数据库转储

hoj*_*oju 2 python database csv mysqldump

我有一个CSV文件,并希望产生的SQLite,MySQL和Postgres的,Oracle和MSSQL数据的转储.

是否有一个通用API(理想情况下基于Python)来做到这一点?

我可以使用ORM将数据插入每个数据库,然后导出转储,但这需要安装每个数据库.它似乎也浪费资源 - 这些CSV文件很大.

由于每个数据库的变化,我对自己尝试编写SQL很谨慎.理想情况下,有人已经完成了这项艰苦的工作,但我还没有找到它.

Dav*_*ser 5

SQLAlchemy是一个数据库库(以及ORM功能)支持您提到的所有不同数据库(以及更多)的方言中的SQL生成.

在正常使用中,您可以创建SQL表达式/指令(使用schema.Table对象),创建数据库引擎,然后将指令绑定到引擎,以生成SQL.

但是,发动机并非严格必要; 每个方言都有一个编译器,可以在没有连接的情况下生成SQL; 唯一需要注意的是,你需要阻止它生成绑定参数,就像默认情况下那样:

from sqlalchemy.sql import expression, compiler
from sqlalchemy import schema, types
import csv

# example for mssql
from sqlalchemy.dialects.mssql import base
dialect = base.dialect()
compiler_cls = dialect.statement_compiler
class NonBindingSQLCompiler(compiler_cls):
    def _create_crud_bind_param(self, col, value, required=False):
        # Don't do what we're called; return a literal value rather than binding
        return self.render_literal_value(value, col.type)

recipe_table = schema.Table("recipe", schema.MetaData(), schema.Column("name", types.String(50), primary_key=True), schema.Column("culture", types.String(50)))

for row in [{"name": "fudge", "culture": "america"}]: # csv.DictReader(open("x.csv", "r")):
    insert = expression.insert(recipe_table, row, inline=True)
    c = NonBindingSQLCompiler(dialect, insert)
    c.compile()
    sql = str(c)
    print sql
Run Code Online (Sandbox Code Playgroud)

上面的例子确实有效; 它假定您知道目标数据库表模式; 它应该很容易适应从CSV导入并生成多个目标数据库方言.