作者:桃花岛的小米_992 | 来源:互联网 | 2023-01-27 16:25
我有这个代码:
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
熊猫在哪里DataFrame
(但对于这个问题并不重要).
这给我的错误是:
sqlalchemy.orm.exc.UnmappedClassError: Class ''advertiser'' is not mapped
从阅读文档中我可以争先恐后地提出这个问题,但不仅仅是那个......这是什么Mapper
以及为什么它对这个库的功能如此不利?为什么"类"没有映射?显然,我该怎样做才能将它"映射"到这个图书馆想要映射的内容?
1> univerio..:
A Mapper
是ORM中的M. 这是将您的表(advertisers
在本例中)映射到类的实例(在这种情况下您缺少)的事情,以便您对其进行操作.
它让你感到困惑的原因是因为SQLAlchemy实际上是两个库中的一个 - 一个叫做SQLAlchemy Core,另一个叫SQLAlchemy ORM.Core提供了处理表和构造返回行的查询的能力,而ORM构建在Core之上,以提供处理类的实例及其作为抽象的关系的能力.核心大致对应的东西,你可以在做Connection
和Engine
,而ORM大致相当于事情可以做的Session
.
所以,所有这些都是session.bulk_insert_mappings
一个ORM功能,如果没有映射类就不能使用它.
你能做什么呢?使用等效的Core功能:
query = advertisers.insert().values(missing_advetisers.to_dict('records'))
engine.execute(query) # or session.execute(query)
甚至使用pandas提供的to_sql
功能:
missing_advetisers.to_sql("advertiser", engine, if_exists="append")
如果您坚持使用ORM,则需要为表声明一个映射类.使用反射时最简单的方法就是使用automap
.链接的文档有很多例子,所以我不在这里详细介绍.