我有一个csv文件,想为sqlite、mysql、postgres、oracle和mssql生成数据转储。
有没有一个通用的api(最好是基于python的)来实现这一点?
我可以使用orm将数据插入到每个数据库中,然后导出转储,但是这需要安装每个数据库。这似乎也是浪费资源-这些csv文件很大。
由于每个数据库的变化,我对自己尝试构建sql很谨慎。理想情况下,有人已经做了这项艰苦的工作,但我还没有找到。
最佳答案
SQLAlchemy是一个数据库库,它(以及ORM functionality)在您提到的所有不同数据库的SQL generation中支持dialects。
在正常使用中,可以创建一个sql表达式/指令(使用schema.Table object),创建一个database engine,然后将该指令绑定到引擎以生成sql。
但是,引擎并不是绝对必要的;每个方言都有一个compiler可以在没有连接的情况下生成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
上面的示例实际上是有效的;它假设您知道目标数据库表模式;它应该很容易适应从csv导入并为多个目标数据库方言生成。
关于python - 如何生成各种数据库转储,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4121658/