Python 如何生成各种数据库转储
我有一个CSV文件,希望为sqlite、mysql、postgres、oracle和mssql生成数据转储 是否有一个通用的API(理想情况下是基于Python的)来实现这一点 我可以使用ORM将数据插入每个数据库,然后导出转储,但是这需要安装每个数据库。这似乎也是对资源的浪费——这些CSV文件很大Python 如何生成各种数据库转储,python,database,csv,mysqldump,Python,Database,Csv,Mysqldump,我有一个CSV文件,希望为sqlite、mysql、postgres、oracle和mssql生成数据转储 是否有一个通用的API(理想情况下是基于Python的)来实现这一点 我可以使用ORM将数据插入每个数据库,然后导出转储,但是这需要安装每个数据库。这似乎也是对资源的浪费——这些CSV文件很大 由于每个数据库的差异,我不敢尝试自己编写SQL。理想情况下,有人已经完成了这项艰巨的工作,但我还没有找到它。你可以这样做- 或 或者试试这个 当然,您可能需要调整上面提到的脚本以满足您的需要。我不是
由于每个数据库的差异,我不敢尝试自己编写SQL。理想情况下,有人已经完成了这项艰巨的工作,但我还没有找到它。你可以这样做- 或 或者试试这个
当然,您可能需要调整上面提到的脚本以满足您的需要。我不是数据库向导,但在Python中,没有一个通用的API可以满足您的要求。它定义了一个API,访问DB的模块应该使用该API,并且AFAIK至少被MySQL和Postgre python模块(和)使用,这可能是一个起点 然而,我试图走的道路将是另一条:
#/垃圾箱/垃圾箱
mysqldump--compact--compatible=ansi--default character set=binary mydbname|
grep-v‘KEY’|
grep-v“唯一密钥”|
perl-e'local$/;$=;s/,\n\)/\n\)/gs;打印“开始;\n”;印刷品;打印“提交;\n”|
perl-pe'
如果(/^(插入.+?)\(/){
$a=$1;
s/\\'\''\''\'\''\''\''\'/g;
s/\\n/\n/g;
s/\),\(/\);\n$a\(/g;
}
' |
sqlite3 output.db
您可以用python编写脚本(在这种情况下,您应该考虑性能)
我选择的理由是:
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导入并为多个目标数据库方言生成。但是每个数据库格式之间都有细微的差异,那么我想您需要分别处理每个格式,但是这些脚本应该可以帮助您获得我不是落选者,但我猜不管是谁做的,都是因为你的答案只不过是谷歌点击[合法答案,因此如果你问我,不值得投反对票,但有点草率];)第三步是我关心的。如果有任何东西可以为每个数据库创建insert语句?有很多商业实用程序可以在一些最常见的数据库之间自动进行转换(它们的价格在40到900美元之间)。然而,这些实用程序通常处理全范围的数据库位和螺栓(索引、外键等)。另外,我不确定这些实用程序是否可以编写脚本,或者它们是否只能通过GUI工作。对不起,被打断了!我不知道上述公用事业的牙线替代品(例如:)。老实说,为了只导入一个表,我宁愿自己研究各种SQL方言之间的差异:当涉及到定义模式和编写insert语句时,它们通常都是微不足道的。如果有疑问,您可以为计划使用的每个数据库创建初始导入和转储,并确保“转换代码”将生成一个与目标数据库本身生成的文件相同的文件。@Plumo-另请参见底部的“我的编辑”
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