SQLAlchemy不映射反射类

时间:2017-07-30 08:03:43

标签: python reflection sqlalchemy

我有这个代码: def advertiser_table(引擎):     return table('advertiser',metadata,autoload = True,autoload_with = engine) 后来我试试这个: advertisers = advertiser_table(engine) ... session.bulk_insert_mappings(         advertisers.name,         missing_advetisers.to_dict( '记录'),     ) 其中missing_adverisers是一个Pandas DataFrame(但对于这个问题并不重要)。 这给我的错误是: sqlalchemy.orm.exc.UnmappedClassError:未映射类“'advertiser'' 从阅读文档中我可以争论到足够的问题,但不仅仅是那个......什么是Mapper,为什么它对这个库的功能如此不利?为什么“类”没有映射?显然,我该怎样做才能将它“映射”到这个图书馆想要映射的内容?

1 个答案:

答案 0 :(得分:5)

Mapper是ORM中的M.这是将您的表(在本例中为advertisers)映射到类的实例(在这种情况下您缺少)的事情,以便您对其进行操作。

它让你感到困惑的原因是因为SQLAlchemy实际上是两个库中的一个 - 一个叫做SQLAlchemy Core,另一个叫SQLAlchemy ORM。 Core提供了处理表和构造返回的查询的能力,而ORM构建在Core之上,以提供处理类实例及其作为抽象的关系的能力。核心大致对应于您可以在ConnectionEngine上执行的操作,而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。链接的文档有很多例子,所以我不打算在这里详细介绍。