我有这个代码:
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_adverisers
Pandas在哪里DataFrame
(但对于这个问题并不重要)。
这给我的错误是:
sqlalchemy.orm.exc.UnmappedClassError: Class ''advertiser'' is not mapped
通过阅读文档,我可以争先恐后地提出问题,但仅此而已......什么是Mapper
以及为什么它对这个库的功能如此有害?..为什么没有映射“类”?显然,我该怎么做才能将它“映射”到这个库想要它映射的任何东西?
AMapper
是 ORM 中的 M。它是将您的表(advertisers
在本例中)映射到类的实例(在本例中您没有)以便您对其进行操作的东西。
之所以让您感到困惑,是因为 SQLAlchemy 实际上是两个库合二为一——一个称为 SQLAlchemy Core,另一个是 SQLAlchemy ORM。Core 提供处理表和构造返回行的查询的能力,而 ORM 构建在 Core 之上,提供处理类实例及其关系作为抽象的能力。核心大致相当于事情可以做的Connection
和Engine
,而ORM大致相当于事情可以做的Session
。
因此,所有这些都是session.bulk_insert_mappings
ORM 功能,如果没有映射类,您将无法使用它。
你能做什么呢?使用等效的核心功能:
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] 删除。
我来说两句