2012-08-08 18 views
5

這是我database.pyFlask你如何用init_db()聲明地使用sqlalchemy?

engine = create_engine('sqlite:///:memory:', echo=True) 
session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) 
Base = declarative_base() 
Base.query = session.query_property() 

def init_db(): 
    # import all modules here that might define models so that 
    # they will be registered properly on the metadata. Otherwise 
    # you will have to import them first before calling init_db() 
    import models 
    Base.metadata.create_all(engine) 

,這是我backend.py

from flask import Flask, session, g, request, render_template 
from database import init_db, session 
from models import * 

app = Flask(__name__) 
app.debug = True 
app.config.from_object(__name__) 

# Serve static file during debug 
if app.config['DEBUG']: 
    from werkzeug import SharedDataMiddleware 
    import os 
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, { 
    '/': os.path.join(os.path.dirname(__file__), 'static') 
    }) 

@app.route('/') 
def foo(): 
    session.add(User()) 
    session.commit() 
    return "NOTHING HERE." 

if __name__ == "__main__": 
    init_db() 
    app.run(port=8888) 

我注意到了幾個奇怪的事情:

  1. 當我做python backend.py我看到創建表兩次。執行相同的create table語句
  2. 當我訪問'/'時,即使在100%確定表已創建時,也會收到以下錯誤。爲什麼?

cursor.execute(statement, parameters) OperationalError: (OperationalError) no such table: users u'INSERT INTO users DEFAULT VALUES'()

+0

你可以發佈你的模型代碼嗎?不知道你到底在做什麼。一般來說,您應該只調用一次數據庫創建(init_db)。我建議至少從backend.py中取出它,然後只調用一次database.py。 – codegeek 2012-08-08 14:51:02

回答

8

當你創建一個SQLite數據庫在內存中,只有接觸到創建它的特定線程 - 改變create_engine('sqlite:///:memory:')create_engine('sqlite:////some/file/path/db.sqlite'和你的表會存在。

至於爲什麼你會看到兩次創建的表 - 默認情況下,調試模式下的Flask與每次更改代碼時重新加載的服務器一起運行。爲了在啓動時產生一個實際運行服務器的新進程 - 所以你的init_db函數在啓動服務器之前被調用,然後當服務器創建一個子進程來爲請求提供服務時再次調用它。

+1

你說得對,內存數據庫是線程本地的。這裏的一個重要洞察是:在Flask的開發服務器中,路由處理程序在與主線程不同的線程中運行。這就是爲什麼相同的'db'對象實際上表示不同的數據庫,取決於它使用的是哪個線程。我試圖在這裏注意到這一點:http://gehrcke.de/2015/05/in-memory-sqlite-database-and-flask-a-threading-trap/ – 2015-05-08 14:10:47

相關問題