it-swarm.com.de

SQLAlchemy "default" vs "server_default" Leistung

Gibt es einen Leistungsvorteil (oder -nachteil) bei der Verwendung von default anstelle von server_default Für die Zuordnung von Standardwerten für Tabellenspalten bei der Verwendung von SQLAlchemy mit PostgreSQL?

Mein Verständnis ist, dass default den Ausdruck in INSERT (normalerweise) und server_default fügt den Ausdruck in die Anweisung CREATE TABLE Ein. Scheint, als wäre server_default Analog zur typischen Behandlung von Standardwerten direkt in der Datenbank wie:

CREATE TABLE example (
    id serial PRIMARY KEY,
    updated timestamptz DEFAULT now()
);

... aber es ist mir nicht klar, ob es effizienter ist, Standardwerte für INSERT oder über die Tabellenerstellung zu verarbeiten.

Gibt es eine Leistungsverbesserung oder -verschlechterung für Zeileneinfügungen, wenn jeder der default -Parameter im folgenden Beispiel in server_default Geändert würde?

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())

HINWEIS: Die beste Erklärung, die ich bisher für die Verwendung von default anstelle von server_default Gefunden habe, bezieht sich nicht auf die Leistung ( , siehe Mike Bayers SO Antwort auf das Thema ). Meine vereinfachte Zusammenfassung dieser Erklärung ist, dass defaultserver_default vorgezogen wird, wenn ...

  • Die Datenbank kann den Ausdruck nicht verarbeiten, den Sie für den Standardwert benötigen oder verwenden möchten.
  • Sie können oder möchten das Schema nicht direkt ändern.

... bleibt also die Frage, ob die Leistung bei der Auswahl zwischen default und server_default berücksichtigt werden sollte?

14
benvc

Es gibt noch etwas Wichtiges, als nur die Leistung der beiden zu vergleichen

Wenn Sie einer vorhandenen Tabelle User mit einigen Daten eine neue Spalte create_at (Not Null) hinzufügen mussten, funktioniert default nicht.

Bei Verwendung von default tritt während des Upgrades der Datenbank der Fehler auf, dass für vorhandene Daten in der Tabelle kein Nullwert eingefügt werden kann. Dies kann zu erheblichen Problemen führen, wenn Sie Ihre Daten selbst zu Testzwecken beibehalten möchten.

Und wenn verwendet server_default Während des Upgrades der Datenbank wird der aktuelle DateTime-Wert in alle zuvor vorhandenen Testdaten eingefügt.

Also in diesem Fall nur server_default wird funktionieren.