2013-12-12 3 views
16

Tutte le tabelle definite in SQLAlchemy hanno una colonna id di tipo UUID.Come impostare una colonna come predefinita per una funzione di PostgreSQL usando SQLAlchemy?

from sqlalchemy.ext.declarative import declarative_base 
from uuid import uuid4 
Base = declarative_base() 

class MyTable(Base): 
    id = Column(UUIDtype, default=uuid4, primary_key=True) 

Dove UUIDtype è un tipo speciale di colonna per il tipo PostgreSQL UUID. Questo crea correttamente la colonna UUID in PostgreSQL, ma genera solo un valore UUID predefinito quando si inserisce usando SQLAlchemy. Questo va bene per alcuni dei miei casi d'uso, ma voglio assegnare l'impostazione predefinita della colonna sul lato PostgreSQL delle cose nel caso in cui un inserto si verifichi al di fuori di SQLAlchemy.

I seguenti posti comando SQL la corretta impostazione predefinita per la colonna:

ALTER TABLE my_table ALTER COLUMN id SET DEFAULT uuid_generate_v4() 

Come posso assegnare questa funzione uuid_generate_v4() come impostazione predefinita la colonna attraverso la definizione del modello SQLAlchemy? Se l'unica opzione è attraverso l'esecuzione di un'istruzione SQL raw, c'è un modo per me di collegare l'esecuzione di quella istruzione nel processo di creazione della tabella?

risposta

20

È necessario utilizzare il parametro server_default per questo.

id = Column(UUIDtype, server_default=text("uuid_generate_v4()"), primary_key=True) 

Vedi Server Side Defaults per ulteriori informazioni.

+0

Grazie. Questo è esattamente ciò di cui avevo bisogno. –

+1

Installa il modulo 'uuid-ossp' con' crea l'estensione uuid-ossp' – mozillazg

+0

Oppure usa 'gen_random_uuid()' invece di 'uuid_generate_v4()' e installa 'pgcrypto' con' create extension pgcrypto' – mozillazg