繁体   English   中英

使用 SQLalchemy 映射 MSSQL 中预先存在的表的方法是什么

[英]What is the way to map preexisting tables in MSSQL with SQLalchemy

我正在使用 SQLAlchemy 连接 MSSQL 数据库,然后我想映射一个预先存在的表并使用 ORM 对其进行条目。 我想使用映射方法而不是创建自己的类有几个原因,但主要的原因是我需要存储 XML 文件,而 SQLAlchemy 不适合 MSSQL 提供的 XML 类型。

以下是我尝试过的内容以及为什么不起作用的描述:

我正在建立与数据库的连接,并以这种方式映射表:

engine = create_engine(conn_str, echo=True)
Base= declarative_base()

class MyClass(Base):
    __table__ = Table('my_table_name', Base.metadata, autoload=True, autoload_with=engine)

执行时抛出异常:

sqlalchemy.exc.ArgumentError: Mapper mapped class MyClass->my_table_name could not assemble any primary key columns for mapped table 'my_table_name'

在 Microsoft SSMS 应用程序中检查表时,任何奇怪的列中都没有“PRIMARY KEY”。 我检查了每一列,发现“Id”列是 IDENTITY 列,我猜这是用作 PK。

我在 google 和 stackoverflow 中阅读了一些文章,发现我可以使用映射器参数以这种方式设置primary_key

class MyClass(Base):
    __table__ = Table('my_table_name', Base.metadata, autoload=True, autoload_with=engine)
    __mapper_args__ = {
        'primary_key':[Table('my_table_name', Base.metadata, autoload=True, autoload_with=engine).c.Id,]
    }

这工作正常,执行代码时也不例外。 我尝试使用新的映射类对表进行输入:

new_entry = MyClass(
Id = 9999,
... all other not null objects
)
Session = sessionmaker(bind=engine)
session = Session()

session.add(new_entry)
session.commit()
session.close()

我收到以下异常:

Cannot insert explicit value for identity column in table 'my_table_name' when 
IDENTITY_INSERT is set to OFF. (544) (SQLExecDirectW)")

我从 new_entry 中删除了“Id”列,但无论我填充或删除了哪些列,仍然会出现相同的错误。 任何想法我在这里做错了什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM