2016-08-10 24 views
1

SQLAlchemyでうまく動作するものを書いたことがありますが、Flaskで同じワークフロー/コマンドを実行しているようです。例えば、ラインのこれらのタイプは「未定義」としてフラグが立てなっていますFlaskフレームワークでSQLAlchemyをどうやって使うのですか?

metadata = MetaData(db) 

abc = Table('abc', metadata, autoload=True) 

s = select([abc.name]) 

私が一番上にflask.ext.sqlalchemy輸入SQLAlchemyのからを持っています。

私は追加で、あるいは代わりにやりたいことがありますか?

(参考のために、私はpythonanywhereでそれを実行している)

+0

仮想環境にSQLAlchemyをインストールしましたか? – SumanKalyan

+0

この動作は明らかに、 'flask_sqlachemy'を明らかにそうでないときに "native"または "real" 'sqlalchemy'であるかのように扱うためです。 ['flask_sqlachemy' documentation](http://flask-sqlalchemy.pocoo.org/2.1/)のどこにも、あなたが推奨または文書化したコードがあります。私はそれが明白にフラグが立てられている場合、それが有用であることに同意します - 私はFlaskを初めて使用したときと同じミスを犯しました。 – holdenweb

答えて

3

SQLAlchemyをインポートすると、あなたは、そのモジュールの内部名への直接アクセスを与えることはありません。また、flask_sqlalchemy(以前のflask.ext.sqlalchemy)モジュールを使用すると、SQLAlchemyの機能にアクセスするために多少異なるメカニズムが使用されることにも注意してください。つまり、SQLAlchemyの現在の知識を転送しようとする試みは、flask_sqlalchemy documentationの調査によって通知されます。

通常、Flaskアプリケーションを作成し、それをSQLAlchemyas in this exampleの呼び出しに渡します。関連するコードを以下に示します。

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

dbオブジェクトは現在の属性としてModelColumnと様々なデータ型を持っているので、あなたは、次のように表/モデルを定義することができます。

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 

単にモジュールからインポートし、それらが修飾されていない使用するのではなくdb名前空間内の様々な名を修飾するために私を強制するので、私は個人的に、この特定のアクセスモデルが好きではないけど、動作しているようです(少なくとも比較的複雑でないデータベースの場合)。

経験豊かなSQLAlchemyユーザーは、標準のアクセスメカニズムを使用することを検討することをお勧めしますが、予期しないスレッド/ Webセッションのやりとりによる微妙なバグに対して脆弱になる可能性があります。私は、複数のデータベースを展開するのは難しいかもしれないと聞いています。私はこれについての直接の証拠はないので、それを事例とみなしてください。

+0

'flask.ext.foo'という形式のエクステンションインポートは、[廃止予定](http://flask.pocoo.org/docs/0.11/upgrading/#extension-imports)ですので、' flask_foo'を使うべきです。 – roy

+0

ありがとう、私は答えを – holdenweb

+0

変更しました。あなたがそれを気に入らない場合は 'db.'を使う必要はなく、sqlalchemyから直接インポートすることができます。それは単なるショートカットです。 – davidism

関連する問題