Edited at

SQLAlchemy + MySQL を使ってみる(その2)

More than 3 years have passed since last update.

前回の続きです。

チュートリアルに沿って進めていますが、最初にちょっとつまづいた以外はスムーズに進められたかなと思います。

それでも少し気になったところをメモしておきます。


カラムの文字数指定

MySQL の場合、必ずカラムの文字数を指定する必要があります。「sqlalchemy.Column()」のように省略することはできません。


sqlalchemy_test2.py

import sqlalchemy

import sqlalchemy.ext.declarative

Base = sqlalchemy.ext.declarative.declarative_base()

class Student(Base):
__tablename__ = 'students'
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
name = sqlalchemy.Column(sqlalchemy.String(20))
kana = sqlalchemy.Column(sqlalchemy.String(40))

url = 'mysql+pymysql://root:@localhost/test_db?charset=utf8'

engine = sqlalchemy.create_engine(url, echo=True)

Base.metadata.create_all(engine)


[エラーメッセージ]

sqlalchemy.exc.CompileError: (in table 'students', column 'name'): Can't generate DDL for NullType(); did you forget to specify a type on this Column?


filter 関数の引数に渡す SQL 文

filter 関数の引数に渡す SQL 文は明示的に text 関数を使います。text 関数を使っていない場合、警告が発生します。


sqlalchemy_test3.py

import sqlalchemy

import sqlalchemy.orm
import sqlalchemy.ext.declarative
from sqlalchemy import text

Base = sqlalchemy.ext.declarative.declarative_base()

class Student(Base):
__tablename__ = 'students'
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
name = sqlalchemy.Column(sqlalchemy.String(20))
kana = sqlalchemy.Column(sqlalchemy.String(40))

url = 'mysql+pymysql://root:@localhost/test_db?charset=utf8'

engine = sqlalchemy.create_engine(url, echo=False)

Session = sqlalchemy.orm.sessionmaker(bind=engine)
session = Session()

students = session.query(Student).filter("id=20") # SAWarning: Textual SQL expression
students = session.query(Student).filter(text("id=20"))


[警告メッセージ]

SAWarning: Textual SQL expression 'id=20' should be explicitly declared as text('id=20') (this warning may be suppressed after 10 occurrences)

{"expr": util.ellipses_string(element)})