Probé esto con una mesa de juguete en Postgres y funciona, creo que debería ser equivalente en Oracle, hágamelo saber.
In [15]:
result = session.connection().execute("insert into usertable values('m6', 'kk2', 'Chile') returning username")
for r in result:
print r
(u'm6',)
Espero que ayude.
EDITAR para Oracle :la única forma de hacerlo que he encontrado no es muy elegante. Estaría usando la conexión sin procesar debajo de SQLAlchemy
conexión, algo como:
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
Desafortunadamente, no creo que haya una forma de crear una cx_oracle variable
ejemplo, simplemente no está disponible en la API, consulte docs .
Entonces, no hay forma de evitar la creación del cursor, incluso si funciona cuando delega más 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
Por supuesto, debe cerrar el cursor en este segundo caso (en el primero, Oracle lo cierra). El punto de que no hay forma de crear una instancia como out = cx_Oracle.STRING()
Como digo, no es muy elegante, pero no creo que haya forma de crear una variable equivalente en SQLAlchemy
. Es algo que el código maneja internamente. Simplemente optaría por el cursor de conexión sin formato.
Espero que ayude.
EDITAR2 :En el código anterior, se agregó out.getvalue()
como se sugiere. ¡Gracias!