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

时间:2015-10-03 07:35:19

标签: python pandas sqlalchemy

有没有办法让pandas(或sqlalchemy)输出通过调用to_sql()而不是实际执行它来执行的SQL?这在许多情况下会很方便,我实际上需要使用相同的数据更新多个数据库,其中python和pandas仅存在于我的一台机器中。

2 个答案:

答案 0 :(得分:5)

这是一个过程问题,而不是编程问题。首先,是使用多个数据库。关系数据库管理系统(RDMBS)被设计为用于许多同时用户/应用/客户端/机器的多用户系统。该数据库旨在作为一个系统运行,作为相关应用程序的中央存储库。一些人认为数据库应该与应用程序无关,并且是以数据为中心的(Postgre人),而其他人则认为数据库应该以应用程序为中心(MySQL人员)。总的来说,了解它们比平面文件电子表格或数据框架更具参与性。

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

  1. 文件级系统,如SQLite和MS Access(数据库驻留在保存到CPU目录的文件中);这些系统虽然功能强大,但多用户主要用于较小的业务应用程序,用户或团队规模相对较小
  2. 服务器级系统,如SQL Server,MySQL,PostgreSQL,DB2,Oracle(数据库通过网络运行,没有任何本地化文件);这些系统用作企业级系统,以运行通过LAN Intranet或Web网络运行的全面业务运营。
  3. 同时,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**)