sql >> Databasteknik >  >> RDS >> Oracle

Hur man kör en rå fråga med att returnera i sqlalchemy

Jag har provat detta med ett leksaksbord i Postgres och det fungerar, jag tror att det borde vara likvärdigt i Oracle, vänligen meddela mig.

In [15]:

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

Hoppas det hjälper.

EDIT för Oracle :det enda sättet att göra det som jag har hittat är inte särskilt elegant. Det skulle vara att använda den råa anslutningen under SQLAlchemy anslutning, något 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

Tyvärr tror jag inte att det finns något sätt att skapa en cx_oracle variable t.ex. är det helt enkelt inte tillgängligt i API:t, se dokument a> .

Då finns det inget sätt att undvika att skapa markören, även om den fungerar när du delegerar mer till 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

Naturligtvis bör du stänga markören i det här andra fallet (i det första stänger Oracle den). Punkten att det inte finns något sätt att skapa en instans som out = cx_Oracle.STRING()

Som jag sa, det är inte särskilt elegant, men jag tror inte att det finns något sätt att skapa en likvärdig variabel i SQLAlchemy . Det är något som koden hanterar internt. Jag skulle bara välja den råa anslutningsmarkören.

Hoppas det hjälper.

EDIT2 :I koden ovan har du lagt till out.getvalue() som föreslaget. Tack!



  1. Dapper &Oracle Clob typ

  2. varchar(255) vs tinytext/tinyblob och varchar(65535) vs blob/text

  3. Anslut din OEM till Grafana med Enterprise Manager-appen för Grafana

  4. Rails/Postgresql SQL-skillnader med datum