SqlAlchemy を使うなら、テーブルカラム構造のエンティティモデルObjectとの
マッピングとしてクエリを書くのが教科書っぽい(スクエアな:square...)のであろう。。
エンティティモデル定義を書かない方法
# -*- coding: utf-8 -*- import sqlalchemy as dbMapper from sqlalchemy import text url = 'mysql+pymysql://username:passwd@localhost:3306/dbname' engine = dbMapper.create_engine(url, echo=True) with engine.connect() as conn: sql = 'SELECT * FROM t_games' rows = conn.execute(text(sql)) for row in rows: print(row)
テーブルカラム構造を定義していないけれど、カラム名参照ができる。
print(row.item_name)
エンティティモデル定義を書く方法
別ソースでエンティティを書く
models.py で、テーブル構造を定義
# -*- coding: utf-8 -*- import sqlalchemy as db from sqlalchemy.orm import registry mapper_reg = registry() Base = mapper_reg.generate_base() class Game(Base): __tablename__ = 't_games' id = db.Column(db.INT, autoincrement=True, primary_key=True) item_name = db.Column(db.String(48), nullable=False) disp_price = db.Column(db.INT, nullable=False) calprice = db.Column(db.INT, nullable=False) create_at = db.Column(db.TIMESTAMP, nullable=True)
読込み実行のコード
# -*- coding: utf-8 -*- import sqlalchemy as dbMapper from sqlalchemy.orm import sessionmaker, scoped_session from models import Game url = 'mysql+pymysql://username:passwd@localhost:3306/dbname' engine = dbMapper.create_engine(url, echo=True) Session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) session = Session() result = session.query(Game).first() print(result.item_name)
.first() で取得結果の先頭を取得しているが、.first()を使わないのであれば、
配列として受けた結果から先頭インデックス[0] で参照する
result = session.query(Game) print(result[0].item_name)
scoped_session で、sessionmakerをラップするようにすれば、
マルチスレッド対応(別セッション)になるので、この方法を多用するであろう。