【17/8/9】副業6日目
Aug 9, 2017 · 5 min read
前回は、sqlalchemyの reflectを使って、DBからテーブル情報を取得してModelを作成・表示するところまで確認した。
今日は、実際にDBを操作するところまでやってみる。
# -*- coding: utf-8 -*-
import sys
import sqlalchemy
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.engine import create_engine# エンジンの生成(実環境に合わせて設定)
engine = create_engine(“mysql://root:P@ssw0rd@localhost:3306/app1_db”)
conn = engine.connect()# セッション開始
session = sessionmaker(bind=engine)()# mappedなinstanceをリフレクションを使った上で生成
base = automap_base()
base.prepare(engine, reflect=True)# 適当にやりたいことを
blog_post = base.classes.blog_post
result = session.query(blog_post)
for row in result:
print(row.id)
print(row.title)
print(row.text)
print(row.created_date)
print(row.published_date)
print(row.author_id)# セッション終了
session.close()
実行結果
1
????????
??????????????????????????
2017–08–04 11:03:06
None
1日本語が文字化けしているので、3日目で使ったDjangoにデフォルトで設定されている管理者画面(python manage.py runserver 0.0.0.0:8000で起動。http://192.168.1.65:8000/admin/)からblog_postというアプリに適当に登録して、再実行したところ、うまく表示された。
1
????????
??????????????????????????
2017–08–04 11:03:06
None
1
4
test title
test massage
2017–08–09 11:54:49
2017–08–09 11:55:05
1これで、自分でModelを作らずとも、DB情報を取得してModelを生成しDBを操作できるようになった。
次は、実際に使う時のためにどういったクエリが書けるか調べてみる。
# データを検索
result = session.query(blog_post)# データを検索 :all()を指定すると、リストで結果が取得できます。
result = session.query(blog_post).all()# first()を指定すると、最初の1つが取得できます。
result = session.query(blog_post).first()
※変数の中にはひとつしか値が入らないため、for文でiterationできなくなります。# filter_byを指定すると、SQLのWhere区のように検索条件が指定できます。
result_all = session.query(blog_post).filter_by(id='2')# order_byを指定すると、SQLのorder_by区のように並び替えができます。
result_all = session.query(blog_post).order_by('id desc')
※「ascが昇順」または「descが降順」# count()を指定すると、登録されている行数の合計値を取得できます。
count = session.query(blog_post).count()

