【问题标题】:Pandas to_sql doesn't insert any data in my tablePandas to_sql 没有在我的表中插入任何数据
【发布时间】:2018-06-26 16:22:29
【问题描述】:

我正在尝试在我创建的表中插入一些数据。 我有一个如下所示的数据框:

我创建了一个表:

create table online.ds_attribution_probabilities
(
attribution_type text,
channel text,
date date ,
value float
)

我正在运行这个 python 脚本:

engine = create_engine("postgresql://@e.eu-central-1.redshift.amazonaws.com:5439/mdhclient_encoding=utf8")
connection = engine.raw_connection()
result.to_sql('online.ds_attribution_probabilities', con=engine, index = False, if_exists = 'append')

我没有收到任何错误,但是当我检查表中没有数据时。有什么问题?我必须提交或执行额外的步骤吗?

【问题讨论】:

    标签: python pandas sqlalchemy


    【解决方案1】:

    尝试指定架构名称:

    result.to_sql('ds_attribution_probabilities', con=engine, 
                  schema='online', index=False, if_exists='append')
    

    【讨论】:

    • 也让我陷入困境。谢谢!
    • 一个明显的错误,至于我。不仅没有意义,而且默默地失败了:3年过去了,它还潜伏在那里,等待下一个猎物……
    • 我相信当未传递架构参数时,该表是在 postgres public 架构上创建的,因此它不是“静默失败”,而是在您不期望的地方创建表.
    • 1+ 或者如果您已经在数据库连接中包含架构,请不要将其放在表名中。
    【解决方案2】:

    希望这对其他人有所帮助。如果您传递连接对象,to_sql 将以看起来像是成功插入的形式静默失败。这对于 Postgres 来说绝对是正确的,但我也假设其他人也是如此,基于方法文档:

    con : sqlalchemy.engine.Engine or sqlite3.Connection
        Using SQLAlchemy makes it possible to use any DB supported by that
        library. Legacy support is provided for sqlite3.Connection objects.
    

    这让我很着迷,因为输入提示指出 Union[Engine, Connection],这在“技术上”是正确的。

    如果您与SQLAlchemy 进行会话,请尝试传递con=session.get_bind(),

    【讨论】:

    • 天啊,那是我的问题!我不敢相信这实际上是当前的行为 o_O
    • 更糟糕的是,如果它由于作为参数传递的未指定的显式模式而静默失败,它会在您的 publiv 模式中创建表!这就是你所有消失的数据都被附加到的地方!
    【解决方案3】:

    我有一个类似的问题,因为我将 sqlalchemy connection 对象而不是 engine 对象传递给 con 参数。在我的情况下,表已创建但为空。

    【讨论】:

      【解决方案4】:

      在我的例子中,快速选项阻碍了将数据写入数据库。

      为什么这不影响快速加载,我还没有弄清楚。

      此代码不起作用:

      engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect={}".format(db_params), fast_executemany=True)
      df.to_sql('tablename', engine, index=False, schema = 'dbo', if_exists='replace' )
      

      没有fast_executemany=True,代码运行良好。

      【讨论】:

        【解决方案5】:

        检查autocommit 设置:https://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit

        engine.execute(text("SELECT my_mutating_procedure()").execution_options(autocommit=True))
        

        【讨论】:

          【解决方案6】:

          这可能是因为它默认为公共数据库,并且公共数据库/架构下可能有一个具有该名称的表,其中包含您的数据。

          @MaxU 的回答确实对某些人有所帮助,但对其他人没有帮助。 对于其他人,您可以尝试以下其他方法:

          创建引擎时,请像这样指定架构名称:

          engine = create_engine(*<connection_string>*,
              connect_args={'options': '-csearch_path={}'.format(*<dbschema_name>*)})
          

          链接:https://stackoverflow.com/a/49930672/8656608

          【讨论】:

            【解决方案7】:

            我在使用.connect() 和.begin() 时遇到了同样的问题

            with engine.connect() as conn, conn.begin():
                     dataframe.to_sql(name='table_name', schema='schema',
                     con=conn, if_exists='append', index=False)
                     conn.close()
            

            只需删除 .connect() 和 .begin() 即可。

            【讨论】:

            • 上下文管理器的重点不是你不必调用 close() 或 begin() 吗?
            猜你喜欢
            • 2022-01-09
            • 2020-12-01
            • 2022-01-22
            • 1970-01-01
            • 2020-10-21
            • 2019-05-24
            • 2021-03-06
            • 2021-09-29
            • 1970-01-01
            相关资源
            最近更新 更多