SQLAlchemy "default"与"server_default"性能对比

16 浏览
0 Comments

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...

  • 数据库无法处理您需要或想使用的默认值表达式。
  • 您无法或不想直接修改模式。

...因此,选择defaultserver_default之间是否应考虑性能的问题仍然存在?

0