サンプル
from sqlalchemy import create_engine, text from sqlalchemy.orm import Session, registry import sqlalchemy as db
mapper_reg = registry() Base = mapper_reg.generate_base() class Sample(Base): __tablename__ = 'samples' id = db.Column(db.UUID, nullable=False, primary_key=True) name = db.Column(db.String(32), nullable=False) color = db.Column(db.String(32), nullable=False) point = db.Column(db.INT, nullable=False) create_time = db.Column(db.TIMESTAMP, nullable=False)
# 接続情報、username, password, host, port, dbname は設定済 engine = create_engine(f'postgresql://{username}:{password}@{host}:{port}/{dbname}')
execute で直接SQLクエリ
with Session(autocommit=False, autoflush=True, bind=engine) as session: sql = "SELECT * FROM samples WHERE color = '%s'" % 'Red' res = session.execute(text(sql)) slist = res.mappings().all() for s in slist: print("%s %s %s %s %d" % (s.get('create_time'), s.get('id'), s.get('name'), s.get('color'), s.get('point')))
from_statement で SQL
with Session(autocommit=False, autoflush=True, bind=engine) as session: sql = "SELECT * FROM samples WHERE color = '%s'" % 'Red' res = session.query(Sample).from_statement(text(sql)).all() for s in res: print("%s %s %s %s %d" % (s.create_time, s.id, s.name, s.color, s.point))
from_statement と bind パラメータ
with Session(autocommit=False, autoflush=True, bind=engine) as session: sql = "SELECT * FROM samples WHERE color = :color AND point = :point" res = session.query(Sample).from_statement(text(sql).params(color='Green',point=34)).all() for s in res: print("%s %s %s %s %d" % (s.create_time, s.id, s.name, s.color, s.point))
bind パラメータ INSERT 実行、RETURNING句 SQL
with Session(autocommit=False, autoflush=True, bind=engine) as session: try: sql = """ INSERT INTO samples (name, color, point) VALUES(:name, :color, :point) RETURNING id """ res = session.execute(text(sql).params(name='Tokyo', color='Green', point=124) ).scalar() print(res) except Exception as e: print(e) session.rollback() raise else: session.commit()