我有 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中获取值。有可能吗?
答案 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)