4

SQLAlchemy を使用して Flask で SQL データベースをセットアップしようとしています。この github ページの例に従ってコードをモデリングしていますが、うまく動作しないようです。

次のエラーが発生し続けます。

sqlalchemy.exc.OperationalError: (OperationalError) no such table: user u'INSERT INTO user (username, email) VALUES (?, ?)' ('test', 'test@gmail.com')

これが私のコードです:

from flask import Flask, render_template, request, url_for, request, redirect
from flask.ext.sqlalchemy import SQLAlchemy
import sqlite3
import os

app = Flask(__name__)
sqlite3.connect(os.path.abspath("test.db"))
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///test.db"

db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email
    def __repr__(self):
        return "<User %r>" % self.username

x = User("test", "test@gmail.com")
db.session.add(x)
db.session.commit()
@app.route("/")
def index():
    return User.query.all()     

if __name__ == "__main__":
    init.db()
    app.run(debug=True)

エラーが各セッションに関係していることは知っていますが、与えられた例ではセッションが明示的に初期化されていないため、少し混乱しています。

4

1 に答える 1

5

Python はファイルを解析し、すべての行を実行します (もっと複雑だと思いますが、それはどうでもいいことです)。したがって、次の行に到達します (これは の前に if __name__ == "__main__": ...実行されます:

db.session.commit()

xユーザーをデータベースに追加しようとします。しかし、数行後に を呼び出してデータベース/テーブルを作成しようとするため、データベース/テーブルはまだ存在しませんinit.db()。これは間違っています。とはinit? コードのどこにも定義されていません。

これ をもう一度よく読んでください

コードは次のようになります。

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///test.db"

db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return "<User %r>" % self.username

@app.route("/")
def index():
    return User.query.all() # I don't think this will work

if __name__ == "__main__":
    db.create_all()

    x = User("test", "test@gmail.com")
    db.session.add(x)
    db.session.commit()

    app.run(debug=True)

db.create_all()データベースが既に存在する場合、失敗してクラッシュすることに注意してください。Flask-Scriptを見てください。アプリのセットアップ スクリプトを作成するのに役立ちます。

于 2013-07-14T15:14:24.800 に答える