熊猫to_sql在我的表中没有插入任何数据

Nas*_*lla 6 python sqlalchemy pandas

我正在尝试在创建的表中插入一些数据。我有一个看起来像这样的数据框:

数据框

我创建了一个表:

create table online.ds_attribution_probabilities
(
attribution_type text,
channel text,
date date ,
value float
)
Run Code Online (Sandbox Code Playgroud)

我正在运行此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')
Run Code Online (Sandbox Code Playgroud)

我没有收到任何错误,但是当我检查表中没有数据时。有什么事吗 我是否必须承诺或执行其他步骤?

小智 16

我遇到了类似的问题,因为我将 sqlalchemy连接对象而不是引擎对象传递给con参数。就我而言,表已创建但留空。

  • 为我工作`self.engine = create_engine(f'mysql+pymysql://{self.db_user}:{self.db_password}@{self.db_host}:{self.db_port}/{self.db_name}') self.engine.connect() as conn: result = df.to_sql('table-name', self.engine, if_exists='append', index=False)` 之前我传递的是 conn 而不是引擎 obj (3认同)

Max*_*axU 14

尝试指定架构名称:

result.to_sql('ds_attribution_probabilities', con=engine, 
              schema='online', index=False, if_exists='append')
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这是一个明显的错误。不仅毫无意义,而且悄无声息地失败了:三年过去了,它仍然潜伏在那里,等待着下一个猎物…… (9认同)
  • 我相信当未传递模式参数时,该表是在 postgres“public”模式上创建的,因此它不是“无声地失败”,而是在您不期望的地方创建表。 (3认同)
  • 也让我卡住了。谢谢! (2认同)
  • 1+ 或者如果您已将架构包含在数据库连接中,请勿将其放在表名称中。 (2认同)

小智 11

希望这对其他人有帮助。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.
Run Code Online (Sandbox Code Playgroud)

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

如果你有一个SQLAlchemy尝试通过的会话con=session.get_bind(),

  • 天哪,那是我的问题!我不敢相信这实际上是当前的行为 o_O (5认同)
  • 更糟糕的是,如果由于作为参数传递的未指定的显式模式而导致失败,它会在您的 publiv 模式中创建表!这就是您所有消失的数据被附加的地方! (2认同)