SQLAlchemy scoped_session没有从DB获取最新数据

时间:2018-01-06 15:17:28

标签: python-3.x postgresql flask-sqlalchemy

我对整个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>

我认为我的问题是对会话的误解。任何人都可以帮助我吗?

1 个答案:

答案 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更好。