Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como executar uma consulta bruta com retorno em sqlalchemy


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!