SQLAlchemy 不映射反射类

小黄人

我有这个代码:

def advertiser_table(engine):
    return Table('advertiser', metadata, autoload=True, autoload_with=engine)

后来我试试这个:

advertisers = advertiser_table(engine)
...
session.bulk_insert_mappings(
        advertisers.name,
        missing_advetisers.to_dict('records'),
    )

missing_adverisersPandas在哪里DataFrame(但对于这个问题并不重要)。

这给我的错误是:

sqlalchemy.orm.exc.UnmappedClassError: Class ''advertiser'' is not mapped

通过阅读文档,我可以争先恐后地提出问题,但仅此而已......什么是Mapper以及为什么它对这个库的功能如此有害?..为什么没有映射“类”?显然,我该怎么做才能将它“映射”到这个库想要它映射的任何东西?

宇宙

AMapper是 ORM 中的 M。它是将您的表(advertisers在本例中)映射到类的实例在本例中您没有)以便您对其进行操作的东西。

之所以让您感到困惑,是因为 SQLAlchemy 实际上是两个库合二为一——一个称为 SQLAlchemy Core,另一个是 SQLAlchemy ORM。Core 提供处理表和构造返回行的查询的能力,而 ORM 构建在 Core 之上,提供处理类实例及其关系作为抽象的能力。核心大致相当于事情可以做的ConnectionEngine,而ORM大致相当于事情可以做的Session

因此,所有这些都是session.bulk_insert_mappingsORM 功能,如果没有映射类,您将无法使用它。

你能做什么呢?使用等效的核心功能:

query = advertisers.insert().values(missing_advetisers.to_dict('records'))
engine.execute(query)  # or session.execute(query)

或者甚至使用熊猫提供的to_sql功能:

missing_advetisers.to_sql("advertiser", engine, if_exists="append")

如果您坚持使用 ORM,则需要为您的表声明一个映射类。使用反射时最简单的方法是使用automap. 链接的文档有很多例子,这里就不赘述了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章