A little special use case
Create an ORM in class declaration format from declarative_base in sqlalchemy.orm.
I want to create ʻUser` class as follows and set the initial value of num to 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)
Since None and 1 cannot be added, an error will occur if this is left as it is. If you look there, you will find default
, server_default
keyword parameter.
default
is the value used when committing to table, server_default
is the initial value inside CREATE TABLE
.
When you want to use it before commit ...? It took longer than necessary to find it. The conclusion is simple and you should use __init__
normally.
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)
The reference also says that you can use __init__
. http://docs.sqlalchemy.org/en/latest/orm/constructors.html#mapping-constructors