【问题标题】:Python - Can I insert rows into one database using a cursor (from select) from another database?Python - 我可以使用来自另一个数据库的游标(来自选择)将行插入一个数据库吗?
【发布时间】:2018-08-29 22:17:45
【问题描述】:

我正在尝试从我们的主数据库 (postgres) 中选择数据并将其插入到临时 sqlite 数据库中以进行一些比较、分析和报告。有没有一种简单的方法可以在 Python 中做到这一点?我正在尝试做这样的事情:

从主 Postgres 数据库获取数据:

import psycopg2
postgres_conn = psycopg2.connect(connection_string)
from_cursor = postgres_conn.cursor()
from_cursor.execute("SELECT email, firstname, lastname FROM schemaname.tablename")

插入到 SQLite 表中:

import sqlite3
sqlite_conn = sqlite3.connect(db_file)
to_cursor = sqlite_conn.cursor()
insert_query = "INSERT INTO sqlite_tablename (email, firstname, lastname) values %s"
to_cursor.some_insert_function(insert_query, from_cursor)

所以问题是:是否有适用于这种情况的some_insert_function(使用 pyodbc 或使用 sqlite3)?

如果是,如何使用?上面的insert_query 会起作用吗?还是应该修改?

如果 Python 中不存在这样的函数,任何其他建议/方法也将不胜感激。提前致谢!

【问题讨论】:

    标签: python sql postgresql sqlite pyodbc


    【解决方案1】:

    您应该将选择查询的结果传递给execute_many

    insert_query = "INSERT INTO smallUsers values (?,?,?)"
    to_cursor.executemany(insert_query, from_cursor.fetchall())
    

    您还应该使用参数化查询(? 标记),如下所述:https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.execute

    如果要避免将整个源数据库加载到内存中,可以使用以下代码一次处理 100 行:

    while True:
        current_data = from_cursor.fetchmany(100)
        if not current_data:
            break
        to_cursor.exectutemany(insert_query, current_data)
        sqlite_conn.commit()
    sqlite_conn.commit()
    

    【讨论】:

    • 我正在寻找一种不使用fetchall() 的方法,因为它可以根据数据的大小在内存中创建一个巨大的列表
    • 您可以使用 fetchmany(100) 代替。您可以尝试以下方法:while True: current_data = from_cursor.fetchmany(100) if not current_data: break to_cursor.exectutemany(insert_query, current_data)
    【解决方案2】:

    您可以从 pyodbc 或 sqlite 查看 executemany。如果您可以从您的选择中构建参数列表,则可以将该列表传递给 executemany。

    根据您计划插入的记录数量,性能可能会成为此开放问题中提到的问题。 https://github.com/mkleehammer/pyodbc/issues/120

    【讨论】:

    • 更新信息回复:pyodbc 的fast_executemany 属性here
    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多