sql >> Database >  >> RDS >> Oracle

Een onbewerkte query uitvoeren met retourneren in sqlalchemy

Ik heb dit geprobeerd met een speelgoedtafel in Postgres en het werkt, ik denk dat het equivalent zou moeten zijn in Oracle, laat het me weten.

In [15]:

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

Ik hoop dat het helpt.

BEWERKEN voor Oracle :de enige manier om het te doen die ik heb gevonden is niet erg elegant. Het zou de onbewerkte verbinding onder SQLAlchemy gebruiken verbinding, zoiets als:

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

Helaas denk ik niet dat er een manier is om een ​​cx_oracle variable te maken het is bijvoorbeeld gewoon niet beschikbaar in de api, zie docs .

Er is dan geen manier om het maken van de cursor te vermijden, zelfs als het werkt wanneer u meer delegeert aan 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

Natuurlijk moet u de cursor in dit tweede geval sluiten (in het eerste sluit orakel het). Het punt dat er geen manier is om een ​​instantie zoals out = cx_Oracle.STRING() te maken

Zoals ik al zei, het is niet erg elegant, maar ik denk niet dat er een manier is om een ​​equivalente variabele te creëren in SQLAlchemy . Het is iets dat de code intern afhandelt. Ik zou gewoon voor de onbewerkte verbindingscursor gaan.

Ik hoop dat het helpt.

EDIT2 :In de bovenstaande code is out.getvalue() . toegevoegd zoals voorgesteld. Bedankt!



  1. Wat zijn de grootste voordelen van het gebruik van INDEXES in mysql?

  2. Mysql:Aggregatiefunctie werkt niet zonder group by

  3. SQL-query om berichten te selecteren die tot meerdere categorieën behoren

  4. Hoe krijg ik op verzoek informatie over de verbindings-ID?