Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara menjalankan kueri mentah dengan kembali di sqlalchemy

Saya sudah mencoba ini dengan tabel mainan di Postgres dan berhasil, saya pikir harus setara di Oracle, beri tahu saya.

In [15]:

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

Semoga membantu.

EDIT untuk Oracle :satu-satunya cara untuk melakukannya yang saya temukan tidak terlalu elegan. Itu akan menggunakan koneksi mentah di bawah SQLAlchemy koneksi, seperti:

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

Sayangnya, menurut saya tidak ada cara untuk membuat cx_oracle variable misalnya, itu tidak tersedia di api, lihat dokumen .

Kemudian, tidak ada cara untuk menghindari pembuatan kursor, meskipun itu berfungsi saat Anda mendelegasikan lebih banyak ke 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

Tentu saja, Anda harus menutup kursor dalam kasus kedua ini (dalam kasus pertama, oracle menutupnya). Intinya tidak ada cara untuk membuat instance seperti out = cx_Oracle.STRING()

Seperti yang saya katakan, ini tidak terlalu elegan, tetapi saya rasa tidak ada cara untuk membuat variabel yang setara di SQLAlchemy . Ini adalah sesuatu yang ditangani kode secara internal. Saya hanya akan memilih kursor koneksi mentah.

Semoga membantu.

EDIT2 :Pada kode di atas, ditambahkan out.getvalue() seperti yang disarankan. Terima kasih!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan jumlah nilai kolom tertentu di Oracle dengan gabungan dalam

  2. Apakah ada cara untuk memaksa Oracle mengubah rencana kueri tanpa menggunakan petunjuk?

  3. Perbarui menggunakan Gabung - Multi DB/Tabel

  4. bantuan oracle hilang koma

  5. Cara mendapatkan nilai untuk tanggal berikutnya dan berikutnya dalam sebuah tabel