2016-03-28 100 views
1

我有web服务器(512 RAM)其中: FLASK + SQLAlchemy的(SQLite的) - > uWSGI - >的NginxSQLAlchemy的返回SELECT命令(query.all)的不同的结果

问题: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; 
+0

http://flask-sqlalchemy.pocoo.org/ – davidism

回答

0

你必须每个工人一个SQLAlchemy的会议,并可能使用2名工人与uwsgi。 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; 
+0

谢谢你,你是对的! uWSGI多线程和多任务的问题。 现在我选择了一种不好的方式:禁用多线程和多重程序。但是现在SQLAlchemy正常工作。 我会努力的。 –

+0

@МаксимДанилов:只需为每个**请求创建一个新会话 – Daniel

相关问题