J'ai essayé cela avec une table de jouets dans Postgres et cela fonctionne, je pense que cela devrait être équivalent dans Oracle, veuillez me le faire savoir.
In [15]:
result = session.connection().execute("insert into usertable values('m6', 'kk2', 'Chile') returning username")
for r in result:
print r
(u'm6',)
J'espère que ça aide.
MODIFIER pour Oracle :la seule façon de le faire que j'ai trouvée n'est pas très élégante. Il utiliserait la connexion brute sous SQLAlchemy
connexion, quelque chose comme :
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
Malheureusement, je ne pense pas qu'il existe un moyen de créer une variable cx_oracle variable
exemple, il n'est tout simplement pas disponible dans l'API, voir docs .
Ensuite, il n'y a aucun moyen d'éviter de créer le curseur, même si cela fonctionne lorsque vous déléguez plus à 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
Bien sûr, vous devez fermer le curseur dans ce second cas (dans le premier, oracle le ferme). Le point qu'il n'y a aucun moyen de créer une instance comme out = cx_Oracle.STRING()
Comme je l'ai dit, ce n'est pas très élégant, mais je ne pense pas qu'il existe un moyen de créer une variable équivalente dans SQLAlchemy
. C'est quelque chose que le code gère en interne. Je choisirais simplement le curseur de connexion brut.
J'espère que ça aide.
EDIT2 :Dans le code ci-dessus, ajout de out.getvalue()
comme suggéré. Merci !