从字典中插入SQLalchemy

时间:2019-04-03 09:24:03

标签: python sqlalchemy

我有一本字典,其中的键名与sqlalchemy表/类的列名相同,称为类。

因此,我认为我可以简单地使用下面的代码来更新SQLalchemy类,然后将新更新的数据插入SQL表中。

for key, value in d.items():
    setattr(Series, key, value)

session.add(Series)
session.commit()

但是,这不起作用,因为“ Series”是一个类。因此,我想知道最有效的方法是将字典转换为sqlalchemy类,然后再插入数据库中。

我更喜欢该方法将遍历字典中的每个键,然后更新sql-alchemy类,因为有时缺少将Null值插入数据库的键值。

1 个答案:

答案 0 :(得分:0)

您有一个正确的想法,就是希望直接从字典数据构建对象,但是在classinstance和SQLAlchemy的区别方面走错了路ORM与他们合作。但请放心,这是我们所有人都必须在某个时候或另一个地方学习的东西。

class作为食谱,以instance作为蛋糕。我们使用配方制作蛋糕,并且可以根据需要创建任意数量的蛋糕。

因此,请记住以下这段代码:

for key, value in d.items():
    setattr(Series, key, value) 

...不是在制作蛋糕,而是在更改配方,或者删除比喻,您正在修改class。实际上,该部分代码确实起作用-setattr()将在class对象上工作以及将在instance对象上工作,稍后当您尝试添加{ {1}}指向SQLAlchemy会话。这是在class上引发的错误消息:

  

sqlalchemy.orm.exc.UnmappedInstanceError:类   未映射“ sqlalchemy.ext.declarative.api.DeclarativeMeta”;曾经是一个   类(session.add(Series))提供了需要实例的地方?

构建SQLAlchemy ORM类时,您从__main__.Series实例(通常称为declarative_base)继承,看起来像这样:Base。这使SQLAlchemy在创建class Series(Base):时可以在后台进行一些操作,该操作用于将对instance的更改转换为对数据库的更改。当您向会话中添加对象时,SQLAlchemy会查找该“工具”,但它并不存在于instance上,仅存在于用该class构成的instances上,因此错误。

再次参考错误消息,SQLAlchemy实际上已经解决了您所犯的错误:class

最简单的部分是纠正错误。我们使用字典数据在was a class (__main__.Series) supplied where an instance was required?中创建instance,将class添加到会话中并提交:

instance