Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sqlalchemy返回SELECT命令的不同结果(query.all)_Python_Nginx_Flask_Sqlalchemy_Uwsgi - Fatal编程技术网

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

Python Sqlalchemy返回SELECT命令的不同结果(query.all),python,nginx,flask,sqlalchemy,uwsgi,Python,Nginx,Flask,Sqlalchemy,Uwsgi,我有web服务器512 RAM,带有: 烧瓶+SQLAlchemy SQLite->uWSGI->Nginx 问题:Sqlalchemy返回SELECT命令query.all的不同结果 例如: 在数据库中添加了一些记录。 我重新加载页面:新记录未返回,但旧记录已返回。 重新加载页面:返回所有记录。杰出的 重新加载页面:新记录再次未返回。但是老太太回来了。 只要我不重新启动Flask应用程序,就会发生这种情况 代码如下: DECLARATIVE_BASE = declarative_base()

我有web服务器512 RAM,带有: 烧瓶+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;

每个工作者有一个SQLAlchemy会话,并且可能在uwsgi中使用2个工作者。SQLAlchemy缓存每个会话的结果,因此worker 1的会话将返回新结果,因为您已使用此worker添加了记录,但worker 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;

这应该会有所帮助。SQLAlchemy会话未正确关闭

@app.teardown_appcontext
def shutdown_session(exception=None):
    Session.remove()

谢谢,你说得对!多线程和多协议的uWSGI问题。现在我选择了一种糟糕的方式:禁用多线程和多进程。但是现在炼金术正确地工作了。我会处理它。@Мааааааааааааааааааааа。在重用全局会话及其正在进行的事务时,查询的情况通常不会从事务隔离返回插入的stem。