Tôi đã thử điều này với một bảng đồ chơi trong Postgres và nó hoạt động, tôi nghĩ nó phải tương đương trong Oracle, vui lòng cho tôi biết.
In [15]:
result = session.connection().execute("insert into usertable values('m6', 'kk2', 'Chile') returning username")
for r in result:
print r
(u'm6',)
Hy vọng nó sẽ hữu ích.
CHỈNH SỬA cho Oracle :một cách để làm điều đó mà tôi thấy không được thanh lịch cho lắm. Nó sẽ sử dụng kết nối thô bên dưới SQLAlchemy
kết nối, một cái gì đó như:
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
Rất tiếc, tôi không nghĩ có cách tạo cx_oracle variable
ví dụ, nó không có sẵn trong api, hãy xem tài liệu .
Sau đó, không có cách nào để tránh việc tạo con trỏ, ngay cả khi con trỏ hoạt động khi bạn ủy quyền nhiều hơn cho 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
Tất nhiên, bạn nên đóng con trỏ trong trường hợp thứ hai này (trong trường hợp đầu tiên, oracle đóng nó). Vấn đề là không có cách nào để tạo một phiên bản như out = cx_Oracle.STRING()
Như tôi đã nói, nó không đẹp lắm, nhưng tôi không nghĩ có cách nào để tạo một biến tương đương trong SQLAlchemy
. Nó là một cái gì đó mà mã xử lý nội bộ. Tôi chỉ sử dụng con trỏ kết nối thô.
Hy vọng nó sẽ hữu ích.
EDIT2 :Trong đoạn mã trên, đã thêm out.getvalue()
như đề xuất. Cảm ơn!