Eu tentei isso com uma mesa de brinquedos no Postgres e funciona, acho que deve ser equivalente no Oracle, por favor me avise.
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 ajude.
EDITAR para Oracle :a única maneira de fazer isso que encontrei não é muito elegante. Estaria usando a conexão bruta abaixo de
SQLAlchemy
conexão, 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
Infelizmente, não acho que exista uma maneira de criar uma
cx_oracle variable
instância, ele simplesmente não está disponível na API, consulte docs . Então, não há como evitar a criação do cursor, mesmo que funcione quando você delega mais para
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
Claro, você deve fechar o cursor neste segundo caso (no primeiro, o oracle o fecha). O ponto em que não há como criar uma instância como
out = cx_Oracle.STRING()
Como eu disse, não é muito elegante, mas não acho que exista uma maneira de criar uma variável equivalente em
SQLAlchemy
. É algo que o código manipula internamente. Eu iria apenas para o cursor de conexão bruto. Espero que ajude.
EDIT2 :No código acima, adicionado
out.getvalue()
como sugerido. Obrigado!