有没有办法让pandas(或sqlalchemy)输出通过调用to_sql()
而不是实际执行它来执行的SQL?这在许多情况下会很方便,我实际上需要使用相同的数据更新多个数据库,其中python和pandas仅存在于我的一台机器中。
答案 0 :(得分:5)
这是一个过程问题,而不是编程问题。首先,是使用多个数据库。关系数据库管理系统(RDMBS)被设计为用于许多同时用户/应用/客户端/机器的多用户系统。该数据库旨在作为一个系统运行,作为相关应用程序的中央存储库。一些人认为数据库应该与应用程序无关,并且是以数据为中心的(Postgre人),而其他人则认为数据库应该以应用程序为中心(MySQL人员)。总的来说,了解它们比平面文件电子表格或数据框架更具参与性。
通常,RDMS有两种结构类型:
同时,Pandas不是一个数据库,而是一个数据分析工具包(很像MS Excel),虽然它可以从RDMS导入/导出查询的结果集。因此,它不为DDL/DML过程维护本机SQL方言。此外,pandas在操作系统的内存中运行,调用Python脚本,不能被其他客户端/机器共享。为了在脚本运行期间了解数据框的不同状态,Pandas不跟踪您想要的更改,除非您使用之前和之后的方式设计它并识别列/行更改。
满口说道,为什么不使用ONE数据库,让你的Python脚本只是连接到数据库以将数据导入/导出到数据框的众多客户端中的另一个。因此,在每次数据帧更改后实际运行to_sql()
。回想一下熊猫' to_sql使用if_exists
参数:
# DROPS TABLE, RECREATES IT, AND UPDATES IT
df.to_sql(name='tablename', con=conn, if_exists='replace')
# APPENDS DF DATA TO EXISTING TABLE
df.to_sql(name='tablename', con=conn, if_exists='append')
反过来,连接到集中式数据库的每个应用程序/机器只需要刷新它们的实例,并且可以实时获得当前数据以满足其最终用途需求。当然,如果另一个用户在编辑模式下有一个表记录,而脚本尝试更新它,则表锁定状态在多用户环境中可能是一个问题。但这里的交易可能有所帮助
答案 1 :(得分:0)
根据doc,使用echo参数:
engine = create_engine("mysql://scott:tiger@hostname/dbname", **echo=True**)