ids casuali in sqlalchemy (tralicci)
-
19-09-2019 - |
Domanda
sto usando piloni e sqlalchemy e mi chiedevo come avrei potuto avere qualche randoms id come primary_key.
Soluzione
il modo migliore è quello di utilizzare gli UUID generati in modo casuale:
import uuid
id = uuid.uuid4()
tipi di dati UUID sono disponibili nativamente in alcuni database come PostgreSQL (SQLAlchemy ha una nativa uuid tipo di dati PG per questo scopo - a 0,5 la sua chiamata sqlalchemy.databases.postgres.PGUuid
). Si dovrebbe anche essere in grado di memorizzare un UUID in qualsiasi campo CHAR 16 byte (anche se non ho provato questo in particolare su MySQL o altri).
Altri suggerimenti
Io uso questo modello e funziona abbastanza bene. fonte
from sqlalchemy import types
from sqlalchemy.databases.mysql import MSBinary
from sqlalchemy.schema import Column
import uuid
class UUID(types.TypeDecorator):
impl = MSBinary
def __init__(self):
self.impl.length = 16
types.TypeDecorator.__init__(self,length=self.impl.length)
def process_bind_param(self,value,dialect=None):
if value and isinstance(value,uuid.UUID):
return value.bytes
elif value and not isinstance(value,uuid.UUID):
raise ValueError,'value %s is not a valid uuid.UUID' % value
else:
return None
def process_result_value(self,value,dialect=None):
if value:
return uuid.UUID(bytes=value)
else:
return None
def is_mutable(self):
return False
id_column_name = "id"
def id_column():
import uuid
return Column(id_column_name,UUID(),primary_key=True,default=uuid.uuid4)
#usage
my_table = Table('test',metadata,id_column(),Column('parent_id',UUID(),ForeignKey(table_parent.c.id)))
Anche se zzzeek credo sia l'autore di SQLAlchemy, quindi se questo è sbagliato saprebbe, e vorrei ascoltarlo.
O con mappatura ORM:
import uuid
from sqlalchemy import Column, Integer, String, Boolean
def uuid_gen():
return str(uuid.uuid4())
Base = declarative_base()
class Device(Base):
id = Column(String, primary_key=True, default=uuid_gen)
Questa memorizza come una stringa che fornisce una migliore compatibilità del database. Tuttavia, si perde la capacità del database per memorizzare più in modo ottimale e utilizzare l'UUID.