【问题标题】:python pandas : how to control the constraints and indices automatically created by to_sql?python pandas:如何控制 to_sql 自动创建的约束和索引?
【发布时间】:2015-04-20 15:43:34
【问题描述】:

我正在使用 pandas 0.16 和 sqlalchemy 将数据导出到 Microsft SQL Server 2014 数据库。 数据框 to_sql 方法会自动在表上创建某些约束,例如它创建一个布尔列必须为 0 或 1 的约束。

我怀疑这些限制正在减慢出口进程。有没有办法至少暂时禁用它们(即只有在所有数据都在 SQL 中之后才重新启用它们)?

另外,这是否记录在任何地方?我在 pandas 文档和 sqlalchemy 中都找不到任何提及。

【问题讨论】:

  • 我刚刚注意到 to_sql 为每个布尔字段创建了两个重复的约束。这会减慢一切。
  • 此外,pandas 是一个社区项目,因此非常欢迎为改进文档做出贡献(或者甚至只是打开问题以更详细地解释文档中缺少的内容)!
  • @Joris,是我向 github 报告了这个错误。我用不同的用户名注册,但那是我。你会注意到我在这里提出这个问题后不久提交了 github 报告
  • 顺便说一句,我永远无法理解人们如何对问题投反对票。我发现了一个未记录的错误,人们对我的帖子投了反对票?随便...

标签: python pandas sqlalchemy dataframe


【解决方案1】:

to_sql 将布尔数据写入 0 和 1 的原因是,SQL Server 没有布尔数据类型(参见例如Is there a Boolean data type in Microsoft SQL Server like there is in MySQL?)。
在这种情况下,SQLAlchemy 默认将这些约束添加到列中,如 SQLAlchemy 文档中所述:http://docs.sqlalchemy.org/en/latest/core/type_basics.html#sqlalchemy.types.Boolean

使用to_sql(记录在here)中的dtype参数覆盖默认类型的可能性,您可以指定不创建此约束:

from sqlalchemy.types import Boolean
df.to_sql('name', engine, dtype={'my_bool_col': Boolean(create_constraint=False)})

【讨论】:

  • 我明白了 - 谢谢。所以我需要为每个布尔列指定选项?此外,to_sql 方法为每个布尔列创建两个这样的约束。一种可能性是 pandas 创建了一个,而 sql_alchemy 创建了另一个,但我还不确定。无论哪种方式 - 这是错误的!现在,我发现使用 SQL 语句禁用或删除约束并不那么繁琐。
  • 是的,现在你需要为每一列指定它(除非 sqlalchemy 提供了一些东西)。但是您可以使用例如{col: Boolean(create_constraint=False) for col in df.select_dtypes(['bool']).columns} 来执行此操作。如果您想办法让这种增强变得更容易,您可以随时报告此类增强的问题。
  • 对于重复约束,请提供更多关于 github 问题的详细信息。我已经在那里问过了,但如果你发现哪里有问题,那会很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多