SQLAlchemy "default"与"server_default"性能对比
SQLAlchemy "default"与"server_default"性能对比
在使用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
的最好解释没有涉及性能(参见Mike Bayer在SO上的答案)。我对该解释的过度简化总结是,在以下情况下,应优先使用default
而不是server_default
...
- 数据库无法处理您需要或想使用的默认值表达式。
- 您无法或不想直接修改模式。
...因此,选择default
和server_default
之间是否应考虑性能的问题仍然存在?