【问题标题】:Optimization of create/run multiple SQLalchemy Engines?创建/运行多个 SQLalchemy 引擎的优化?
【发布时间】:2019-11-07 20:59:04
【问题描述】:

假设我在 MySQL 中有 30 个数据库,从 db1 到 db30。我有一个 python 脚本,它将创建引擎并连接到 one db,

import pandas as pd
import MySQLdb
from sqlalchemy import create_engine

df = pd.read_csv('pricelist.csv')

new_df = df[['date','time','new_price']]

engine = create_engine('mysql+mysqldb://root:python@localhost:3306/db1', echo = False)

new_df.to_sql(name='temporary_table', con=engine, if_exists = 'append', index=False)

with engine.begin() as cnx:
    sql_insert_query_new = 'REPLACE INTO newlist (SELECT * FROM temporary_table)'
    cnx.execute(sql_insert_query_new)
    cnx.execute("DROP TABLE temporary_table")

现在有了上面的脚本,我需要 30 个 python 脚本来创建引擎并连接每个数据库来进行查询。要调用这 30 个脚本,我需要在任务调度程序上使用批处理文件。

是否有使用单个脚本连接多个数据库的优化方法?我阅读了会话,认为它不能容纳多个数据库。如果我有 30 个 python 脚本来做这个创建引擎和连接,在处理性能方面会有什么问题吗?最终,我将在 MySQL 中拥有数百个 db。

谢谢!

注意:每个数据库都有自己唯一的表名。

使用 Python 3.7

【问题讨论】:

    标签: python mysql sqlalchemy mysql-python


    【解决方案1】:

    我想你可以这样做:

    import pandas as pd
    import MySQLdb
    from sqlalchemy import create_engine
    
    df = pd.read_csv('pricelist.csv')
    
    new_df = df[['date','time','new_price']]
    db_names = [f'db{i}' for i in range(1, 31)]
    table_names = ['temporary_table', 'table_name_2', 'table_name_3', ...]
    
    for db, tb in zip(db_names, table_names):
        engine = create_engine(f'mysql+mysqldb://root:python@localhost:3306/{db}', echo=False)
    
        new_df.to_sql(name=tb, con=engine, if_exists='append', index=False)
    
        with engine.begin() as cnx:
            sql_insert_query_new = f'REPLACE INTO newlist (SELECT * FROM {tb})'
            cnx.execute(sql_insert_query_new)
            cnx.execute(f"DROP TABLE {tb}")
    

    【讨论】:

    • 谢谢维克特。这看起来像是一种可能性——我稍后回家时需要尝试一下。但是,每个 db 的数据库表都是唯一的。我预见到这个迭代会因为表命名而输出错误?抱歉,如果我最初的问题不清楚。 更新了我的问题
    • 我已尝试使用上述方法连接两个数据库。但是它给了我错误 sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1049, "Unknown database '('db1',)'")。我认为这行不通。你知道运行多个脚本和创建/连接每个数据库是否会导致性能问题?
    • 你可以运行mysql -uroot -ppython然后show databases列出数据库
    • 对不起,我没有关注你 - 答案似乎没有回答我的问题。我已经知道我所有的数据库名称并在 db_names 中声明了它。
    猜你喜欢
    • 2023-01-24
    • 2021-12-20
    • 2017-07-10
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2011-05-14
    相关资源
    最近更新 更多