Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So führen Sie eine Rohabfrage mit Rückgabe in sqlalchemy aus

Ich habe dies mit einem Spielzeugtisch in Postgres versucht und es funktioniert, ich denke, es sollte in Oracle gleichwertig sein, bitte lassen Sie es mich wissen.

In [15]:

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

Hoffe es hilft.

BEARBEITEN für Oracle :die einzige Möglichkeit, die ich gefunden habe, ist nicht sehr elegant. Es würde die Rohverbindung unter SQLAlchemy verwenden Verbindung, so etwas wie:

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

Leider glaube ich nicht, dass es eine Möglichkeit gibt, eine cx_oracle variable zu erstellen Beispielsweise ist es einfach nicht in der API verfügbar, siehe docs .

Dann gibt es keine Möglichkeit, das Erstellen des Cursors zu vermeiden, selbst wenn es funktioniert, wenn Sie mehr an SQLAlchemy delegieren :

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

Natürlich sollten Sie in diesem zweiten Fall den Cursor schließen (im ersten Fall schließt Oracle ihn). Der Punkt, dass es keine Möglichkeit gibt, eine Instanz wie out = cx_Oracle.STRING() zu erstellen

Wie gesagt, es ist nicht sehr elegant, aber ich glaube nicht, dass es eine Möglichkeit gibt, eine äquivalente Variable in SQLAlchemy zu erstellen . Es ist etwas, das der Code intern verarbeitet. Ich würde einfach den rohen Verbindungscursor nehmen.

Hoffe es hilft.

BEARBEITEN2 :Im obigen Code wurde out.getvalue() hinzugefügt wie vorgeschlagen. Danke!