Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment exécuter une requête brute avec retour dans sqlalchemy

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 !