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!