Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak wykonać surowe zapytanie z powrotem w sqlalchemy

Próbowałem tego z zabawkowym stolikiem w Postgresie i działa, myślę, że powinien być równoważny w Oracle, daj mi znać.

In [15]:

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

Mam nadzieję, że to pomoże.

EDYTUJ dla Oracle :jedyny sposób na zrobienie tego, który znalazłem, nie jest zbyt elegancki. Byłoby to użycie surowego połączenia pod SQLAlchemy połączenie, coś takiego:

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

Niestety nie sądzę, że istnieje sposób na utworzenie cx_oracle variable na przykład nie jest dostępny w interfejsie API, zobacz dokumenty .

Wtedy nie ma sposobu, aby uniknąć tworzenia kursora, nawet jeśli działa, gdy delegujesz więcej do 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

Oczywiście w tym drugim przypadku należy zamknąć kursor (w pierwszym przypadku wyrocznia go zamyka). Punkt, w którym nie ma możliwości utworzenia instancji, takiej jak out = cx_Oracle.STRING()

Jak mówię, nie jest to zbyt eleganckie, ale nie sądzę, że istnieje sposób na utworzenie równoważnej zmiennej w SQLAlchemy . Jest to coś, co kod obsługuje wewnętrznie. Wybrałbym po prostu surowy kursor połączenia.

Mam nadzieję, że to pomoże.

EDYTUJ2 :W powyższym kodzie dodano out.getvalue() jak sugerowano. Dzięki!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego nie mogę użyć mojego typu zdefiniowanego przez użytkownika Oracle w ten sposób?

  2. Parametry połączenia Oracle ODP.NET:co znajduje się w źródle danych?

  3. Jak sklonować środowisko R12.2?

  4. Zapytaj dwa miasta w STATION o najkrótszej i najdłuższej nazwie CITY,

  5. oracle - konwertuj wiele formatów daty na jedną sformatowaną datę