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

2024-03-30

我有一张桌子Ticket具有id(自动递增),票号(读取序列的触发器),value and date在甲骨文中。我想做以下事情:

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

我需要在原始 SQL 中执行此操作,但我不知道如何获取 sqlalchemy 中的值。是否可以?


我已经在 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',)

希望能帮助到你。

编辑甲骨文:我发现的一种方法不是很优雅。它将使用下面的原始连接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 http://cx-oracle.readthedocs.org/en/latest/variable.html#varobj.

然后,就无法避免创建游标,即使当您将更多委托给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()正如建议的那样。谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 sqlalchemy 中执行返回的原始查询 的相关文章

随机推荐