2013-07-20 4 views
6

sto usando:Come ottenere inserted_primary_key da db.engine.connect() eseguire chiamata

CPython 2.7.3, 
Flask==0.10.1 
Flask-SQLAlchemy==0.16 
psycopg2==2.5.1 
and 
postgresql-9.2 

Cercando di ottenere PK dalla chiamata inserto con l'alchimia.

Ottenere motore in questo modo:

app = Flask(__name__) 
app.config.from_envvar('SOME_VAR') 
app.wsgi_app = ProxyFix(app.wsgi_app) # Fix for old proxyes 

db = SQLAlchemy(app) 

e l'esecuzione di query di inserimento in app:

from sqlalchemy import text, exc 
    def query(): 
     return db.engine.connect().execute(text(''' 
     insert into test...'''), kw) 
    rv = query() 

Ma cercando di accesso inserted_primary_key proprietà, ottiene:

InvalidRequestError: Statement is not an insert() expression construct. 

Come abilitare implicit_returning in il mio caso, leggere i documenti non aiuta?

risposta

4

È possibile utilizzare la clausola RETURNING e gestire da soli:

INSERT INTO test (...) VALUES (...) RETURNING id 

Quindi è possibile recuperare l'id come normalmente recuperare i valori dalle query.

Nota che questo funziona su Postgres, ma non funziona su altri motori db come MySQL o sqlite.

Non penso che ci sia un modo agnostico db per farlo in SQLAlchemy senza usare la funzionalità ORM.

+1

Per mysql - result.lastrowid – Sviatoslav

+0

Grazie, sto usando Postgresql, ho provato tutto, come 'lastrowid '(non funziona, restituisce sempre 0), la tua soluzione è l'unica che funziona per me – Neekey

+0

funzionerà con redshift? –

2

C'è qualche ragione per cui si fa una richiesta di testo al posto del normale sqlalchemy insert()? Se stai usando sqlalchemy probabilmente sarà molto più facile per voi di riformulare la query in:

from sqlalchemy import text, exc, insert 

# in values you can put dictionary of keyvalue pairs 
# key is the name of the column, value the value to insert 
con = db.engine.connect() 
ins = tablename.insert().values(users="frank") 
res = con.execute(ins) 
res.inserted_primary_key 
[1] 

In questo modo sqlalchemy farà l'associazione per voi.

+0

Grazie ma preferisco utilizzare SQL crudo. C'è un modo per forzare 'implicit_returning = True engine kw' a flask-sqlalchemy? – greggyNapalm

+0

Non sono sicuro di come si possa ottenere se si utilizza raw sql, ma se si inserisce alchemy(), funziona bene, ho modificato la mia risposta per mostrarlo. –

+2

Mi piace l'SQL raw e non voglio dichiarare il mio schema una seconda volta in codice python. Tutto ciò che voglio è ottenere l'ID PK dopo l'inserimento con db.engine.connect(). Execute ('' 'sql raw insert here' '' – greggyNapalm

0

È possibile utilizzare lastrowid

rv = query() 
rv.lastrowid