我对整个ORM主题都不熟悉,而且我已经搜索了论坛和文档。 问题是关于使用SQLAlchemy作为PostgreSQL的ORM的烧瓶应用程序。
__init__.py包含以下行:
db = SQLAlchemy()
在其他文件中引用创建的对象以访问数据库。
模型有一个保存功能:
def save(self):
db.session.add(self)
db.session.commit()
以及更新功能:
def update(self):
for var_name in self.__dict__.keys():
if var_name is not ('_sa_instance_state' or 'id' or 'foreign_id'):
# Workaround for JSON update problem
flag_modified(self, var_name)
db.session.merge(self)
db.session.commit()
当我尝试保存新对象时会出现问题。保存功能将其写入数据库,直接查询数据库时可见(psql等),但后面的ORM查询如下:
model_list = db.session.query(MyModel).filter(MyModel.foreign_id == this_id).all()
给出一个空的回复。
更新功能的调用确实按预期工作,在使用ORM请求时可以看到新数据。
我总是使用相同的会话对象,例如:
<sqlalchemy.orm.scoping.scoped_session object at 0x7f0cff68fda0>
如果重新启动应用程序,一切正常,直到创建新对象并尝试使用ORM。
一个非常麻烦的解决方法是使用原始SQL,如:
model_list = db.session.execute('SELECT * FROM models_table WHERE
foreign_id = ' + str(this_id))
为ResultProxy提供如下最新数据:
<sqlalchemy.engine.result.ResultProxy object at 0x7f0cf74d0390>
我认为我的问题是对会话的误解。任何人都可以帮助我吗?
答案 0 :(得分:0)
它发现问题与会话无关,而是filter()方法:
# Neccessary import for string input into filter() function
from sqlalchemy import text
# Solution or workaround
model_list = db.session.query(MyModel).filter(text('foreign_key = ' + str(this_id))).all()
我无法弄清楚问题:
filter(MyModel.foreign_id == this_id)
但这是另一个问题。
我认为这种方式比执行原始SQL更好。