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