2014-09-19 4 views

risposta

10

È possibile utilizzare inspection a tal fine:

http://docs.sqlalchemy.org/en/latest/core/inspection.html

Passando un'istanza di un oggetto mappato da ispezionare, restituisce un InstanceState, descrivendo tale oggetto. Questo stato contiene anche l'identità:

Base = declarative_base() 

class MyClass(Base): 
    __tablename__ = 'mytable' 
    key = Column(Integer, primary_key=True) 
a = MyClass(key=1) 

from sqlalchemy.inspection import inspect  
pk = inspect(a).identity 
print pk 

Effettua invia:

(1,) 

Da chiavi primarie possono consistere di più colonne, l'identità in generale è una tupla contenente tutti i valori di colonna che fanno parte di la chiave primaria. Nel tuo caso, questo è semplicemente il key.

+0

Grande - grazie !! Proprio quello che stavo cercando! – frip

+0

Questo non funziona più con 'sqlalchemy> = 1.0' – flazzarini

+0

@flazzarini Funziona con' sqlalchemy> = 1.0' ed è ben documentato: http://docs.sqlalchemy.org/en/latest/orm/internals. html # sqlalchemy.orm.state.InstanceState.identity Sembra solo che differisca da quello che vuoi fare. – sebastian

5

Se è necessario recuperare un elenco di chiavi primarie di un class non un instance, di seguito viene descritto come eseguirlo.

È possibile utilizzare il metodo inspect. Ciò restituirà un'istanza Inspect su cui è possibile eseguire l'analisi come segue. In questo esempio, utilizzo l'istanza Inspect per restituirmi tutti i nomi attribute di ogni primary_key di MyClass.

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String 

Base = declarative_base() 

class MyClass(Base): 
    __tablename__ = "myclass" 

    key = Column(Integer, primary_key=True) 
    name = Column(String, primary_key=True) 



from sqlalchemy import inspect 
ins = inspect(MyClass) 
print("Tuple of primary keys: ", ins.primary_key) 

# Let's loop over them and print the attribute key name of each 
for x in ins.primary_key: 
    print(x.key) 

Returns

> Tuple of primary keys: (Column('key', Integer(), table=<myclass>, primary_key=True, nullable=False), Column('name', String(), table=<myclass>, primary_key=True, nullable=False)) 
> key 
> name 
+0

Questo non è quello che l'OP chiedeva. La domanda originale era come recuperare il "valore" delle chiavi primarie per una determinata istanza ** mappata, mentre stai recuperando le colonne che costituiscono la chiave primaria per una ** classe ** mappata. – sebastian

+0

Esattamente, quindi ho cambiato la risposta. – flazzarini

Problemi correlati