SQL创建类型实例和设置默认值有什么区别



我正在学习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参数。这不是默认值,而是配置列类型的信息。

defaultColumn的配置,而不是类型。

不要增加更多的混乱,但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', 
)

最新更新