【发布时间】:2019-02-25 02:59:29
【问题描述】:
在将 SQLAlchemy 与 PostgreSQL 一起使用时,使用 default 而不是 server_default 映射表列默认值是否有性能优势(或劣势)?
我的理解是default(通常)在INSERT 中呈现表达式,而server_default 将表达式放在CREATE TABLE 语句中。似乎server_default 类似于直接在数据库中对默认值的典型处理,例如:
CREATE TABLE example (
id serial PRIMARY KEY,
updated timestamptz DEFAULT now()
);
...但我不清楚在INSERT 上处理默认值还是通过创建表更有效。
如果将下面示例中的每个default 参数更改为server_default,行插入是否会有任何性能改进或下降?
from uuid import uuid4
from sqlalchemy import Column, Boolean, DateTime, Integer
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func
Base = declarative_base()
class Item(Base):
__tablename__ = 'item'
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4)
count = Column(Integer, nullable=False, default=0)
flag = Column(Boolean, nullable=False, default=False)
updated = Column(DateTime(timezone=True), nullable=False, default=func.now())
注意:到目前为止,我找到的关于何时使用 default 而不是 server_default 的最佳解释并未解决性能问题 (see Mike Bayer's SO answer on the subject)。我对该解释的过于简单的总结是,default 比server_default 更受青睐...
- db 无法处理您需要或想要用于默认值的表达式。
- 您不能或不想直接修改架构。
...所以问题是在default 和server_default 之间进行选择时是否应该考虑性能?
【问题讨论】:
标签: python sql postgresql performance sqlalchemy