読者です 読者をやめる 読者になる 読者になる

<Flask> Flask-SQLAlchemy

ちとFlask-SQLAlchemyを試してみた。
データベースを直接呼び出すのでなく、それを包むオブジェクト wrapper object経由で操作するものらしい。

まずはインポート import
接続するデータベースは、app.config['SQLALCHEMY_DATABASE_URI']で指定しないといけないらしい。
しかも絶対パス
で、Flaskのアプ app作ってそいつを引数にして、データベース databaseのオブジェクト dbを作る。

In [3]: from flask.ext.sqlalchemy import SQLAlchemy

In [4]: from flask import Flask

In [5]: app = Flask(__name__)

In [6]: app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///c:/msys64/home/hage/python/works_flask/data.sqlite'

In [7]: db = SQLAlchemy(app)

dbアトリビュート attributeを見てみる。
データベースへのアクセスするためのメソッドがいっぱい、、、

In [7]: dir(db)
Out[7]: 
['AliasOption',
 'AttributeExtension',
 'BIGINT',
 :
 :

db.ModelがデータベースのロウRowのお手本。

In [8]: dir(db.Model)
Out[8]: 
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_decl_class_registry',
 'metadata',
 'query',
 'query_class']

こいつを継承してほしいカラム Columnをプチプチ追加。

In [18]: class Hages(db.Model):
    ...:     __tablename__ = 'Hages'
    ...:     id = db.Column(db.Integer, primary_key=True)
    ...:     username = db.Column(db.String(64), unique=True, index=True)
    ...:     body = db.Column(db.TEXT)

で、データベースを作る。

In [20]: db.create_all()

で、追加したいロウは、クラス db.Modelのオブジェクトを作って、
で、そのオブジェクトをdb.session.add()でデータベースに食わせる。
db.session.commit()も最後に必要。

In [34]: Taro = Hages(username='Taro', body='Fufufu...')

In [63]: db.session.add(Taro)

In [64]: db.session.commit()

In [62]: Jiro = Hages(username='Jiro', body='Fufufu...')

In [63]: db.session.add(Jiro)

In [64]: db.session.commit()

データベースから呼び出すには、
クラスのqueryメソッドを使う。
返しは、Rowの数分のリスト。

In [65]: Hages.query.all()
Out[65]: [<__main__.Hages at 0xba534e0>, <__main__.Hages at 0xba62320>]

In [66]: type(Hages.query.all())
Out[66]: list

In [67]: Hages.query.all()[0].id
Out[67]: 1

In [68]: Hages.query.all()[1].id
Out[68]: 2

In [75]: Hages.query.all()[0].username
Out[75]: 'Taro'

In [76]: Hages.query.all()[1].username
Out[76]: 'Jiro'

In [78]: Hages.query.all()[1].body
Out[78]: 'Fufufu...'

In [81]: Hages.query.get(1).id
Out[81]: 1

In [82]: Hages.query.get(1).username
Out[82]: 'Taro'

ふーん、、、

マニュアル

Flask-SQLAlchemy — Flask-SQLAlchemy Documentation (2.1)

SQLite Home Page

オブジェクトリレーショナルマッパ チュートリアル — SQLAlchemy 0.6.5 ドキュメント (和訳)

sqlite3 コマンド | コマンドの使い方(Linux) | hydroculのメモ