我有一本字典,其中的键名与sqlalchemy表/类的列名相同,称为类。
因此,我认为我可以简单地使用下面的代码来更新SQLalchemy类,然后将新更新的数据插入SQL表中。
for key, value in d.items():
setattr(Series, key, value)
session.add(Series)
session.commit()
但是,这不起作用,因为“ Series”是一个类。因此,我想知道最有效的方法是将字典转换为sqlalchemy类,然后再插入数据库中。
我更喜欢该方法将遍历字典中的每个键,然后更新sql-alchemy类,因为有时缺少将Null值插入数据库的键值。
答案 0 :(得分:0)
您有一个正确的想法,就是希望直接从字典数据构建对象,但是在class
,instance
和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