6

これは私のdatabase.pyです

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はテーブルが2回作成されているのを見ています。同じcreatetableステートメントが実行されます
  2. '/'にアクセスすると、テーブルが作成されたと100%確信している場合でも、次のエラーが発生します。なんで?

cursor.execute(statement、parameters)OperationalError:(OperationalError)そのようなテーブルはありません:users u'INSERT INTO users DEFAULT VALUES'()

4

1 に答える 1

10

メモリ内に SQLite データベースを作成すると、それを作成した特定のスレッドにのみアクセスできます。変更create_engine('sqlite:///:memory:')するcreate_engine('sqlite:////some/file/path/db.sqlite'と、テーブルが存在します。

2 回作成されたテーブルが表示される理由について - デフォルトでデバッグ モードの Flask は、コードを変更するたびにリロードするサーバーで実行されます。起動時に実行するために、実際にサーバーを実行する新しいプロセスを生成します。そのため、init_dbサーバーを起動する前に関数が呼び出され、サーバーが子プロセスを作成してリクエストを処理するときに再度呼び出されます。

于 2012-08-08T17:17:17.960 に答える