Oracle
 sql >> Database >  >> RDS >> Oracle

Come eseguire una query grezza con la restituzione in sqlalchemy

L'ho provato con un tavolo giocattolo in Postgres e funziona, penso che dovrebbe essere equivalente in Oracle, per favore fatemelo sapere.

In [15]:

result = session.connection().execute("insert into usertable values('m6', 'kk2', 'Chile') returning username")
for r in result:
    print r
(u'm6',)

Spero che aiuti.

EDIT per Oracle :l'unico modo per farlo che ho trovato non è molto elegante. Userebbe la connessione grezza sotto SQLAlchemy connessione, qualcosa come:

In [15]:

from sqlalchemy.sql import text
import cx_Oracle
​
cur = session.connection().connection.cursor()
out = cur.var(cx_Oracle.STRING)
par = { "u" : out }   ​
cur.prepare("insert into usertable values('m34', 'kk2', 'Chile') returning username into :u")
cur.execute(None, par)
​
print(out)
print(type(out))
print(out.getvalue())
​
​
<cx_Oracle.STRING with value 'm34'>
<type 'cx_Oracle.STRING'>
m34

Sfortunatamente, non credo che ci sia un modo per creare una cx_oracle variable ad esempio, semplicemente non è disponibile nell'API, vedere documenti .

Quindi, non c'è modo di evitare di creare il cursore, anche se funziona quando ne deleghi di più a SQLAlchemy :

In [28]:

from sqlalchemy.sql import text
import cx_Oracle
​
cur = session.connection().connection.cursor()
out = cur.var(cx_Oracle.STRING)
par = { "u" : out }
​
q = text("insert into usertable values('m43', 'kk2', 'Chile') returning username into :u")
result = session.connection().execute(q, par)
print(par["u"])
print(out)
type(out)

​<cx_Oracle.STRING with value 'm43'>
<cx_Oracle.STRING with value 'm43'>
Out[28]:
cx_Oracle.STRING

Ovviamente in questo secondo caso dovresti chiudere il cursore (nel primo, Oracle lo chiude). Il punto che non c'è modo di creare un'istanza come out = cx_Oracle.STRING()

Come ho detto, non è molto elegante, ma non credo ci sia un modo per creare una variabile equivalente in SQLAlchemy . È qualcosa che il codice gestisce internamente. Andrei solo per il cursore di connessione grezzo.

Spero che aiuti.

EDIT2 :Nel codice sopra, aggiunto out.getvalue() come suggerito. Grazie!