Ein kleiner spezieller Anwendungsfall
Erstellen Sie ein ORM im Klassendeklarationsformat aus declative_base in sqlalchemy.orm.
Ich möchte eine Benutzerklasse wie folgt erstellen und den Anfangswert von num auf 0 setzen.
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)
Da None und 1 nicht hinzugefügt werden können, tritt ein Fehler auf, wenn dieser unverändert bleibt. Wenn Sie dort suchen, finden Sie den Schlüsselwortparameter default
, server_default
.
default
ist der Wert, der beim Festschreiben in die Tabelle verwendet wird. server_default
ist der Anfangswert in CREATE TABLE
.
Wann möchten Sie es vor dem Festschreiben verwenden ...? Es dauerte länger als nötig, um es zu finden. Die Schlussfolgerung ist einfach und Sie sollten "init" normalerweise verwenden.
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)
Die Referenz besagt auch, dass Sie __init__
verwenden können. http://docs.sqlalchemy.org/en/latest/orm/constructors.html#mapping-constructors
Recommended Posts