从pandas.DataFrame.to_sql以字符串形式输出SQL

kli*_*ron 2 python sqlalchemy pandas

有没有一种方法可以使熊猫(或sqlalchemy)输出将由调用to_sql()执行而不是实际执行的SQL ?在许多情况下,当我实际上需要用相同的数据更新多个数据库(而python和pandas仅存在于我的一台计算机中)时,这将很方便。

小智 6

根据doc,使用 echo 参数为:

engine = create_engine("mysql://scott:tiger@hostname/dbname", **echo=True**)


Par*_*ait 5

这比编程问题更多是过程问题。首先,是使用多个数据库。关系数据库管理系统(RDMBS)被设计为多用户系统,可同时用于许多用户/应用程序/客户端/机器。设计为作为一个系统运行,该数据库充当相关应用程序的中央存储库。一些人认为数据库应该对应用程序不可知,并且应该以数据为中心(Postgre人员),而另一些人则认为数据库应该以应用程序为中心(MySQL人员)。总体而言,要了解它们比平面文件电子表格或数据框架更复杂。

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

  1. 文件级系统,如SQLite和MS Access(数据库位于保存在CPU目录中的文件中);这些系统虽然仍然功能强大且具有多用户功能,但它们大多数用于用户或团队规模相对较小的小型企业应用程序
  2. 服务器级别的系统,例如SQL Server,MySQL,PostgreSQL,DB2,Oracle(其中数据库通过网络运行而没有任何本地化文件);这些系统用作企业级系统,以运行通过LAN内联网或Web网络运行的全面业务操作。

同时,Pandas虽然可以从RDMS导入/导出查询的结果集,但它不是数据库而是数据分析工具包(类似于MS Excel)。因此,它不维护DDL / DML过程的本机SQL方言。而且,熊猫在操作系统中的内存中运行,并调用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')
Run Code Online (Sandbox Code Playgroud)

反过来,连接到集中式数据库的每个应用程序/机器都只需要刷新其实例,并且当前数据就可以实时满足其最终用途的需求。当然,如果在脚本尝试更新表时另一个用户在编辑模式下拥有表记录,则在多用户环境中表锁定状态可能是一个问题。但是这里的交易可能会有所帮助。