sql >> Database teknologi >  >> RDS >> Oracle

Sådan udføres en rå forespørgsel med returnering i sqlalchemy

Jeg har prøvet dette med et legetøjsbord i Postgres, og det virker, jeg tror, ​​det burde svare til Oracle, så lad mig det vide.

In [15]:

result = session.connection().execute("insert into usertable values('m6', 'kk2', 'Chile') returning username")
for r in result:
    print r
(u'm6',)

Håber det hjælper.

EDIT for Oracle :den ene måde at gøre det på, som jeg har fundet, er ikke særlig elegant. Det ville være at bruge den rå forbindelse under SQLAlchemy forbindelse, noget som:

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

Desværre tror jeg ikke, der er en måde at oprette en cx_oracle variable på for eksempel er det bare ikke tilgængeligt i api'et, se dokumenter a> .

Så er der ingen måde at undgå at oprette markøren på, selvom den virker, når du uddelegerer mere til 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

Selvfølgelig skal du lukke markøren i dette andet tilfælde (i det første tilfælde lukker Oracle det). Pointen med, at der ikke er nogen måde at oprette en instans som out = cx_Oracle.STRING()

Som jeg sagde, er det ikke særlig elegant, men jeg tror ikke, der er en måde at skabe en tilsvarende variabel i SQLAlchemy . Det er noget, koden håndterer internt. Jeg ville bare gå efter den rå forbindelsesmarkør.

Håber det hjælper.

EDIT2 :I koden ovenfor, tilføjet out.getvalue() som foreslået. Tak!



  1. At have fremmednøglebegrænsning, mens du sletter rækker ved hjælp af indre joinforbindelse

  2. ORA-28860:Fatal SSL-fejl ved brug af UTL_HTTP?

  3. API-serveren returnerer en 404-fejl

  4. Advarsel:mysql_connect():[2002] Ingen sådan fil eller mappe (forsøger at oprette forbindelse via unix:///tmp/mysql.sock) i