Jeg har prøvet dette med et legetøjsbord i Postgres, og det virker, jeg tror, det burde svare til Oracle, så lad mig det vide.
In [15]:
result = session.connection().execute("insert into usertable values('m6', 'kk2', 'Chile') returning username")
for r in result:
print r
(u'm6',)
Håber det hjælper.
EDIT for Oracle :den ene måde at gøre det på, som jeg har fundet, er ikke særlig elegant. Det ville være at bruge den rå forbindelse under SQLAlchemy
forbindelse, noget som:
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
Desværre tror jeg ikke, der er en måde at oprette en cx_oracle variable
på for eksempel er det bare ikke tilgængeligt i api'et, se dokumenter a> .
Så er der ingen måde at undgå at oprette markøren på, selvom den virker, når du uddelegerer mere til 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
Selvfølgelig skal du lukke markøren i dette andet tilfælde (i det første tilfælde lukker Oracle det). Pointen med, at der ikke er nogen måde at oprette en instans som out = cx_Oracle.STRING()
Som jeg sagde, er det ikke særlig elegant, men jeg tror ikke, der er en måde at skabe en tilsvarende variabel i SQLAlchemy
. Det er noget, koden håndterer internt. Jeg ville bare gå efter den rå forbindelsesmarkør.
Håber det hjælper.
EDIT2 :I koden ovenfor, tilføjet out.getvalue()
som foreslået. Tak!