<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