Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何生成各种数据库转储_Python_Database_Csv_Mysqldump - Fatal编程技术网

Python 如何生成各种数据库转储

Python 如何生成各种数据库转储,python,database,csv,mysqldump,Python,Database,Csv,Mysqldump,我有一个CSV文件,希望为sqlite、mysql、postgres、oracle和mssql生成数据转储 是否有一个通用的API(理想情况下是基于Python的)来实现这一点 我可以使用ORM将数据插入每个数据库,然后导出转储,但是这需要安装每个数据库。这似乎也是对资源的浪费——这些CSV文件很大 由于每个数据库的差异,我不敢尝试自己编写SQL。理想情况下,有人已经完成了这项艰巨的工作,但我还没有找到它。你可以这样做- 或 或者试试这个 当然,您可能需要调整上面提到的脚本以满足您的需要。我不是

我有一个CSV文件,希望为sqlite、mysql、postgres、oracle和mssql生成数据转储

是否有一个通用的API(理想情况下是基于Python的)来实现这一点

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


由于每个数据库的差异,我不敢尝试自己编写SQL。理想情况下,有人已经完成了这项艰巨的工作,但我还没有找到它。

你可以这样做-

或者试试这个


当然,您可能需要调整上面提到的脚本以满足您的需要。

我不是数据库向导,但在Python中,没有一个通用的API可以满足您的要求。它定义了一个API,访问DB的模块应该使用该API,并且AFAIK至少被MySQL和Postgre python模块(和)使用,这可能是一个起点

然而,我试图走的道路将是另一条:

  • 将CVS导入MySQL(这只是因为MySQL是我最熟悉的一个,例如,网络上有大量的资料,但您可以从另一个数据库开始执行相同的过程)
  • 生成MySQL转储文件
  • 处理MySQL转储文件,以便修改它以符合SQLite(和其他)语法
  • 处理转储文件的脚本可能非常紧凑,但如果使用regex解析行,它们可能会有些棘手。下面是一个示例脚本MySQL→ 我只是从中粘贴的SQLite:

    #/垃圾箱/垃圾箱
    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编写脚本(在这种情况下,您应该考虑性能)

    我选择的理由是:

  • mysql为我完成了繁重的工作[导入并因此进行数据一致性检查+生成启动SQL文件]
  • 我只需要安装一个数据库
  • 我完全可以控制正在发生的事情以及对过程进行微调的可能性
  • 我可以这样构造我的脚本,以便很容易将其扩展到其他数据库(基本上,我会将其构造为识别单个字段的解析器+一组语法(每个数据库一个语法),我可以通过命令行选项选择)
  • 关于SQL风格之间差异的文档比关于单个DB导入/导出库的文档多得多
  • 编辑:基于模板的方法

    如果出于任何原因,您没有足够的信心自己编写SQL,您可以使用一种基于模板的脚本。我将这样做:

  • 在计划使用的所有4db中导入并生成表的转储
  • 对于每个DB,保存转储的初始部分(包括模式声明和所有其他部分)和一条insert指令
  • 编写一个python脚本,对于每个DB导出,该脚本将输出转储的“头”加上相同的“保存行”,您将通过编程方式将CVS文件中每行的值替换到该“保存行”中
  • 这种方法的明显缺点是,您的“模板”只适用于一个表。它的最大优点是编写这样的脚本非常简单和快速

    HTH至少有一点!

    是一个数据库库,它(以及)支持您提到的所有不同数据库(以及更多数据库)

    在正常使用中,您可以创建SQL表达式/指令(使用),创建,然后将指令绑定到引擎,以生成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
    

    上面的示例实际上是有效的;它假设您知道目标数据库表架构;它应该可以很容易地从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