我正在学习SQLAlchemy,发现定义类型的不同用法以及如何设置默认值。它们之间有什么区别?
示例1
class User(Base):
__tablename__ = "user"
age = sa.Column(
sa.Integer,
default=0,
)
示例2
class User(Base):
__tablename__ = "user"
age = sa.Column(
sa.Integer(),
default=0,
)
和
示例3
class User(Base):
__tablename__ = "user"
age = sa.Column(
sa.Integer(0),
)
这些例子在功能上有什么区别吗?或者它们只是语法上的糖?
澄清一下,前两个是等价的,因为sqlalchemy.schema.Column.params.type_:
中解释了magic/sugar。列的类型,使用实例表示的子类TypeEngine。如果该类型不需要参数,则类的类型也可以发送
通常Integer
列类型不接受参数。Mysql方言有一些奇怪的参数,但一个更好的例子可能是String
,它通常有一个length
参数。这不是默认值,而是配置列类型的信息。
default
是Column
的配置,而不是类型。
不要增加更多的混乱,但default
只在客户端使用。对于数据库服务器端默认值,必须设置server_default
。
String
是一个更好的例子,可能看起来像这样:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name1 = Column(String, default="anonymous")
name2 = Column(String, server_default="anonymous")
name3 = Column(String(15), server_default="anonymous")
下面是postgresql的3个不同名称列的输出(SERIAL
是postgresql主键的一个特殊整数类型):
CREATE TABLE users (
id SERIAL NOT NULL,
name1 VARCHAR,
name2 VARCHAR DEFAULT 'anonymous',
name3 VARCHAR(15) DEFAULT 'anonymous',
)