<<少し特殊なユースケースです>>
sqlalchemy.orm で declarative_base からクラス宣言形式で ORM を作る。
次のように User
class を作って、num の初期値を 0 にしたい。
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, text
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine("sqlite:///:memory:", echo=True)
Base = declarative_base()
class User(Base):
__tablename__="users"
id = Column(Integer, primary_key=True)
num = Column(Integer)
Base.metadata.create_all(engine)
u = User()
print(u.id, u.num+1)
None と 1 は足せないので、このままだとエラーになる。そこで調べてみると default
, server_default
keyword parameter が見つかる。
default
は table に commit するときに使われる値、server_default
は CREATE TABLE
の中に入る初期値。
commit 前に使いたいときは…?というのを探すのに必要以上に時間がかかってしまった。結論は簡単で普通に __init__
を使うべし。
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, text
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine("sqlite:///:memory:", echo=True)
Base = declarative_base()
class User(Base):
def __init__(self, *args, **kwargs):
super(Base, self).__init__(*args, **kwargs)
self.num = 0
__tablename__="users"
id = Column(Integer, primary_key=True)
num = Column(Integer, server_default=text("0"))
Base.metadata.create_all(engine)
u = User()
print(u.id, u.num+1)
リファレンスにも __init__
使えと書いてある。http://docs.sqlalchemy.org/en/latest/orm/constructors.html#mapping-constructors