2016-03-28 94 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

相關問題