【问题标题】:how to turn off autoincrement from table args for mssql dialect如何从表 args 为 mssql 方言关闭自动增量
【发布时间】:2021-04-30 20:09:40
【问题描述】:

是否可以使用 table args 关闭自动增量,还是只能从 Column() 完成?我正在从 pandas 进行批量插入,而 sqlalchemy 对我咆哮说不允许身份插入,而实际上我不想在此表上使用自动增量。

我在想可能有一个 mssql 方言选项可以用作 qwarg,所以我也尝试了 mssql_identity=False,但我得到一个参数错误,msslq 不接受。

class PeopleTb(SqlAlchemyBase):
    __tablename__ = 'people_tb'
    PeopleID = sa.Column(sa.Integer, nullable=False)
    PeopleName = sa.Column(sa.Integer)
    __table_args__ = (
        sa.PrimaryKeyConstraint(PeopleID, name="people_tb_pk", autoincrement=False),
        {"schema": "ods"},
    )

【问题讨论】:

  • 如果身份插入打开,您只能为身份列提供值。

标签: python sql-server sqlalchemy


【解决方案1】:

您可以在调用 to_sql() 之前立即启用 IDENTITY_INSERT:

Base = declarative_base()


class PeopleTb(Base):
    __tablename__ = "people_tb"
    PeopleID = sa.Column(sa.Integer, primary_key=True)
    PeopleName = sa.Column(sa.Integer)


Base.metadata.drop_all(engine)    # for
Base.metadata.create_all(engine)  #   testing

df = pd.DataFrame([(1, 123)], columns=["PeopleID", "PeopleName"])

with engine.begin() as conn:
    conn.exec_driver_sql("SET IDENTITY_INSERT people_tb ON")
    df.to_sql("people_tb", conn, index=False, if_exists="append")

【讨论】:

  • 我喜欢这种方法。然后我需要将身份插入设置回关闭吗?
  • 您当然可以,而且这样做可能是一种很好的形式,尽管我希望 SET IDENTITY_INSERT 状态与数据库会话相关,因此一旦连接关闭,状态将恢复为默认值(关闭)。
猜你喜欢
  • 2020-03-29
  • 2015-01-21
  • 2014-08-09
  • 2020-11-16
  • 2023-03-20
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
相关资源
最近更新 更多