如何在sqlalchemy中返回执行原始查询

时间:2015-07-29 19:17:08

标签: python oracle sqlalchemy

我有 ID (自动增量), ticket_number (触发器读取序列)票据 日期在Oracle中。我想做以下事情:

INSERT INTO TICKET (value, date) values (100, TO_DATE('07-29-2015', 'mm-dd-yyyy')) returning ticket_number into :ticket_number;

我需要在原始SQL中执行此操作,但我不知道如何在sqlalchemy中获取值。有可能吗?

2 个答案:

答案 0 :(得分:3)

我在Postgres的玩具桌上尝试了这个并且它有效,我认为在Oracle中应该相同,请告诉我。

In [15]:

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

希望它有所帮助。

编辑Oracle :我发现的一种方法不是很优雅。它将在SQLAlchemy连接下使用原始连接,例如:

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

不幸的是,我认为没有办法创建cx_oracle variable实例,但它在api中不可用,请参阅docs

然后,没有办法避免创建光标,即使它在您委派更多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

当然,你应该在第二种情况下关闭光标(在第一种情况下,oracle关闭它)。无法创建像out = cx_Oracle.STRING()

这样的实例的观点

正如我所说,它不是很优雅,但我认为没有办法在SQLAlchemy中创建等效变量。它是代码在内部处理的东西。我只想去原始连接光标。

希望它有所帮助。

EDIT2 :在上面的代码中,根据建议添加了out.getvalue()。谢谢!

答案 1 :(得分:1)

您应该能够使用execute命令。 像这样:

raw_SQL = "INSERT INTO TICKET (value, date) values (100, TO_DATE('07-29-2015', 'mm-dd-yyyy')) returning ticket_number into :ticket_number;"
connection = engine.connect()
result = connection.execute(raw_SQL)