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

标签 python nginx flask sqlalchemy uwsgi

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

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

示例:

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

只要我不重新启动 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 session ,并且可能在 uwsgi 中使用 2 个 Worker。 SQLAlchemy 缓存每个 session 的结果,因此工作线程 1 的 session 返回新结果,因为您已使用该工作线程添加了记录,但工作线程 2 的 session 未更新,仅返回旧记录。

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

@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;

关于python - Sqlalchemy 返回 SELECT 命令的不同结果(query.all),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36258154/

相关文章:

python - 2 个 scipy 稀疏 csr 矩阵之间的差异

url - 如果没有尾部斜杠,Nginx 会导致 301 重定向

security - Nginx 从代理服务器中删除 Cookie 的安全标志

postgresql - 无法从 SQLite 切换到 Postgres

python - python 中使用 pandas 的条件循环

python - 比特币:在 PyQT 中解析区 block 链 API JSON

python - 如何在 Python 中将 Sql Server 结果导出到 Excel

nginx - 我可以在 Nginx 中创建一个 "private"位置吗?

python - 是否可以限制 Flask 请求触发的 CPU/内存使用?

python - 如何使用 Flask-restful 中止未知参数?