Sqlalchemy 返回 SELECT 命令的不同结果(query.all)

2024-04-15

我有网络服务器(512 RAM): FLASK + SQLAlchemy (SQLite) -> uWSGI -> Nginx

问题:Sqlalchemy 返回 SELECT 命令 (query.all) 的不同结果。

Example:

  • 在数据库中添加了一些记录。
  • 我重新加载页面:新记录尚未返回(但旧记录已返回)。
  • 重新加载页面:返回所有记录。出色的。
  • 重新加载页面:同样没有返回新记录。 (但老回来了)。

只要我不重新启动 Flask 应用程序,就会发生这种情况。

代码如下:

DECLARATIVE_BASE = declarative_base()
engine = create_engine('sqlite:///database.db')
Session = sessionmaker(bind=engine)
session = Session()

class Order(DECLARATIVE_BASE):
    __tablename__ = 'orders'
    __table_args__ = (
        {'mysql_engine': 'InnoDB', 'sqlite_autoincrement': True, 'mysql_charset': 'utf8'}
    )

    id = Column(INTEGER, autoincrement=True, primary_key=True, nullable=False)  # pylint: disable=invalid-name
    name = Column(TEXT, nullable=False)
    address = Column(TEXT)
    phone = Column(TEXT, nullable=False)
    email = Column(TEXT)
    comment = Column(TEXT)
    totalPrice = Column(DECIMAL(asdecimal=False))
    orderItems = relationship(Orderitem)
    time = Column(TEXT, default=time.strftime("%H:%m %d.%m.%y"))

    def __repr__(self):
        return self.__str__()

    def __str__(self):
        return "<Order(%s)>" % self.__dict__

@app.route('/api/orders', methods=['GET'])
def getAllOrders():
    allOrders = session.query(Order).all()
    return json.dumps(allOrders, cls=new_alchemy_encoder(False, ['orderItems', 'product']), check_circular=False, ensure_ascii=False) #ensure_ascii=False -- for rigth out cyrlic;

每个 Worker 有一个 SQLAlchemy 会话,并且可能在 uwsgi 中使用 2 个 Worker。 SQLAlchemy 缓存每个会话的结果,因此工作线程 1 的会话返回新结果,因为您已使用该工作线程添加了记录,但工作线程 2 的会话未更新,仅返回旧记录。

解决方案:不要创建全局会话,而是为每个请求创建一个新会话。

@app.route('/api/orders', methods=['GET'])
def getAllOrders():
    session = Session()
    allOrders = session.query(Order).all()
    return json.dumps(allOrders, cls=new_alchemy_encoder(False, ['orderItems', 'product']), check_circular=False, ensure_ascii=False) #ensure_ascii=False -- for rigth out cyrlic;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sqlalchemy 返回 SELECT 命令的不同结果(query.all) 的相关文章

随机推荐