2017-07-30 124 views
0

我有这样的代码: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_adverisers是熊猫DataFrame(但它不是这个问题很重要) 。

这给了我的错误是:

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

从阅读我能抢足要问的问题的文件,但没有比这更多...什么是Mapper,为什么会这样不利于这个图书馆的功能是什么?为什么不把“班级”映射出来?显然,我要做什么来将它“映射”到图书馆想要映射的任何地方?

回答

4

A Mapper是ORM中的M.这是将你的表格(在这种情况下为advertisers)映射到类的实例(在这种情况下你错过了),以便你操作它。

它令你感到困惑的原因是因为SQLAlchemy实际上是两个库中的一个 - 一个叫做SQLAlchemy Core,另一个叫做SQLAlchemy ORM。 Core提供了使用表格和构建返回的查询的能力,而ORM构建在Core之上,提供了将类的实例及其关系作为抽象进行工作的能力。核心大致相当于你可以在ConnectionEngine上执行的操作,而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。链接的文档有很多例子,所以在这里我不会详细讨论。

+0

对不起,如果你冲我以前的评论:我忘了“执行”部分。现在都很好。 – wvxvw