<Flask, pandas> Flask-SQLAlchemy + pandas
ちとFlask-SQLAlchemy
を試してみた。
データベースを直接呼び出すのでなく、それを包むオブジェクト wrapper object
経由で操作するものらしい。
まずはインポート import
。
接続するデータベースは、app.config['SQLALCHEMY_DATABASE_URI']
で指定しないといけないらしい。
しかも絶対パス。
で、Flask
のアプ app
作ってそいつを引数にして、データベース database
のオブジェクト db
を作る。
In [3]: from flask_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__', : '_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 [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.3)
オブジェクトリレーショナルマッパ チュートリアル — SQLAlchemy 0.6.5 ドキュメント (和訳)
追記。。。
パンダさんpandas
で、データベースDatabase
を入力してみた。
In [1]: from flask import Flask In [3]: from flask_sqlalchemy import SQLAlchemy In [4]: app = Flask(__name__) In [5]: app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:' In [6]: db = SQLAlchemy(app) C:\Anaconda3\Lib\site-packages\flask_sqlalchemy\__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True to suppress this warning. warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True to suppress this warning.') In [7]: 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 [8]: db.create_all() In [9]: table = ''' ...: id,username,body ...: 1,Taro,Normal ...: 2,Jiro,Wonderful ...: 3,Saburo,Great ...: ''' In [10]: import io In [11]: import pandas as pd In [12]: df = pd.read_csv(io.StringIO(table)) In [13]: df Out[13]: id username body 0 1 Taro Normal 1 2 Jiro Wonderful 2 3 Saburo Great In [22]: df.to_sql('Hages', db.engine.connect(), index=False, if_exists='replace') In [23]: Hages.query.all() Out[23]: [<__main__.Hages at 0x1e990e80>, <__main__.Hages at 0x1e98fef0>, <__main__.Hages at 0x1e987cc0>] In [25]: for i in Hages.query.all(): ...: print('{}\t{}\t{}'.format(i.id, i.username, i.body)) ...: 1 Taro Normal 2 Jiro Wonderful 3 Saburo Great In [26]: Hages.query.filter_by(username='Taro').first().username Out[26]: 'Taro' In [27]: db.session.query(Hages).filter_by(username='Taro').first().username Out[27]: 'Taro'
ミソは、
1... データベースDatabase
をメモリmemory
上に作ってみた。
2... df.to_sql(name,con...)
のcon
は、db.engine.connect()
。
マニュアル。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html