Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在sqlalchemy中执行返回的原始查询_Python_Oracle_Sqlalchemy - Fatal编程技术网

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

Python 如何在sqlalchemy中执行返回的原始查询,python,oracle,sqlalchemy,Python,Oracle,Sqlalchemy,我有一个表Ticket,其中包含Oracle中的id(自动增量)、Ticket\u编号(读取序列的触发器)、值和日期。我想做以下几点: INSERT INTO TICKET (value, date) values (100, TO_DATE('07-29-2015', 'mm-dd-yyyy')) returning ticket_number into :ticket_number; 我需要在原始SQL中执行此操作,但我不知道如何在sqlalchemy中获得值。可能吗?您应该能够使用该命令

我有一个表Ticket,其中包含Oracle中的id(自动增量)、Ticket\u编号(读取序列的触发器)、值和日期。我想做以下几点:

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

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

您应该能够使用该命令。 大概是这样的:

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)

我曾在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
connection下面的原始连接,类似于:

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
当然,在第二种情况下,您应该关闭光标(在第一种情况下,oracle将其关闭)。没有办法创建像
out=cx\u Oracle.STRING()

正如我所说,它不是很优雅,但我认为没有办法在
SQLAlchemy
中创建等效变量。这是代码内部处理的事情。我会选择原始连接光标

希望能有帮助


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

我已经试过了,但是我得到了
***DatabaseError:(DatabaseError)ORA-01008:不是所有变量都绑定了
是的,但是我需要声明变量,它返回值,这就是我认为它抛出错误的原因。嗯,老实说,如果必须传递原始SQL命令,我不太确定如何最好地执行此操作。是否可以选择在sqlalchemy中创建触发器并将其挂接到
DDL
事件?很抱歉,在这方面没有提供更多帮助。oracle子句中的区别在于,它强制您声明一个要返回到的变量,并且应用该子句只会返回
***DatabaseError:(DatabaseError)ORA-01008:不是所有绑定的变量。
。确定。Postgres不接受
返回到
(甚至当您尝试在
pgadmin
中运行它时也不接受。我会尝试类似
session.connection()的操作。执行(“插入到usertable值('m6','kk2','Chile')将用户名返回到?”,结果)
,但我现在无法在oracle中测试它,我想我终于可以在oracle中尝试了,但它确实不起作用。如果有帮助,
session.connection().execute(“insert into usertable values('m6','kkk2','Chile')将用户名返回到:u”,result)
插入寄存器时没有错误,但之后我没有找到返回结果的方法。我也遇到了同样的问题。根据检查,我认为我必须将变量声明为一个类型,但我还没有尝试过。答案一目了然。我要添加的唯一一件事是获取您需要执行的值
out.getvalue()
。谢谢!
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