从pandas.DataFrame.to_sql输出SQL字符串

14

是否有一种方法使pandas(或sqlalchemy)输出通过调用to_sql()执行的SQL而不是实际执行它?在许多情况下,这将非常方便,因为我需要使用相同的数据更新多个数据库,而Python和pandas仅存在于我的一台机器上。


你能举个例子吗? - Leb
这是一个相当通用的问题。假设我们有一个数据框A,由来自数据库的数据组成,并且我们进行一些计算,改变一些列集C。然后,我们希望使用新信息更新多个数据库服务器。与其需要在每台机器上安装完整的Python安装包以及Pandas和所有相关库,不如能够执行类似A.gen_sql(...)的操作,并生成插入/更新语句的SQL(文本)输出,以更新每个服务器。 - kliron
2个回答

9
根据文档,使用echo参数如下: engine = create_engine("mysql://scott:tiger@hostname/dbname", echo=True)

4

这更像是一个过程性问题而非编程问题。首先,涉及到多个数据库的使用。关系型数据库管理系统(RDMBS)旨在为许多同时用户/应用程序/客户端/机器设计多用户系统。设计为作为一个系统运行,数据库作为相关应用程序的中央存储库。有人认为数据库应该对应用程序无关并以数据为中心(PostgreSQL),而另一些人则认为数据库应该以应用程序为中心(MySQL)。总体来说,需要理解它们比扁平化电子表格或数据框更加复杂。

通常,RDMS有两种结构类型:

  1. 文件级别系统(例如SQLite和MS Access),其中数据库保存在保存到CPU目录的文件中;这些系统虽然仍然强大且多用户,但主要用于相对较少用户或小型团队规模的小型业务应用程序
  2. 服务器级别系统,如SQL Server、MySQL、PostgreSQL、DB2、Oracle(其中数据库在没有任何本地化文件的情况下通过网络运行);这些系统作为企业级系统,用于在LAN内部网或Web网络上运行全面的业务操作。
同时,Pandas不是数据库,而是数据分析工具包(类似于MS Excel),尽管它可以导入/导出来自RDMS的查询结果集。因此,它没有原生的DDL/DML过程的SQL方言。此外,pandas在调用Python脚本的OS上运行内存,并且不能被其他客户端/机器共享。除非您在脚本运行时设计了一个之前和之后并识别列/行更改的方式,否则Pandas不会跟踪更改以了解数据帧的不同状态。
说了这么多,为什么不使用一个数据库,让您的Python脚本成为连接到数据库的众多客户端之一,以将数据导入/导出数据帧。因此,在每次数据帧更改后实际运行to_sql()。请记住,pandas的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')

每个连接到中央数据库的应用程序/机器只需要刷新它们的实例,当前数据就可以实时提供给它们的最终使用需求。虽然,在多用户环境中,如果另一个用户在编辑模式下拥有表记录,而您的脚本尝试更新它,则表锁定状态可能会成为一个问题。但是,在这里,事务可以帮助解决这个问题。


感谢您的解释。您的“为什么不”建议与我目前正在做的有点类似。 - kliron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接