SQL 插入适用于 Oracle SQL Developer,但不适用于 python
Posted
技术标签:
【中文标题】SQL 插入适用于 Oracle SQL Developer,但不适用于 python【英文标题】:SQL insert works in Oracle SQL Developer, but not in python 【发布时间】:2016-03-17 13:07:53 【问题描述】:我有一个似乎是 Oracle SQL 的直截了当的插入语句。它在 Oracle SQL Developer 中可以正常工作,但相同的命令在 Python 中不起作用,抱怨
cx_Oracle.DatabaseError: ORA-00933: SQL command not properly ended.
这发生在 cursor.execute() 调用的行上。查询本身是:
insert into TestNamesTable (TestName, TheUser, TheProject) values ('mytest.s', 'bjurasz', 'Beta');
如果在 SQL Developer 中运行,我会得到一个新行。在 Python 中,我得到了终止错误。据我所知,它的形成和终止是正确的。
这是我在 python 中构造查询的方式:
sql = "insert into TestNamesTable (TestName, TheUser, TheProject) values ('%s', '%s', '%s');" % (diagname, username, project)
print sql
cursor.execute(sql)
connection.commit()
【问题讨论】:
您不应该有分号,但这应该会给出“无效字符”错误。 diagname、username、project 的实际值是多少?和静态版一样吗? 使用%
构建查询可能会让您对SQL injection 开放。请改用parameterized statements。
正确,与静态版本相同。我从 python 打印最终字符串,将其复制到 SQL 开发人员中,然后使用它。在 SQL 开发人员中它需要分号,所以我认为它也应该在 python 中。如果我尝试您提供的参数化方法,我会收到一个新错误:ORA-01036:非法变量名称/编号。如果它告诉我哪个名字/号码是非法的,那就太好了...... :(
Alex,我想我现在有两个问题。一种是以适当的格式创建 SQL 字符串。如果我完全对字符串进行硬编码,我可以将行正确插入到数据库中。现在我只需要弄清楚我创建该字符串的方式有什么问题。但是,一旦我插入了该行,我接下来会在 fetchone() 调用中失败,说没有查询。我这样做的原因是该表有 4 列,而不是 3 列。我没有设置的列是自动生成的整数。所以我想查询该行以查看数据库为我设置的值。感谢您的帮助。
查看 oracle sql insert 返回 语法。这就是它应该做的。我在 postgres 上使用了相同的方法来恢复 autogen。 Doc第一眼看不清楚,所以你必须环顾四周。
【参考方案1】:
试试这个:
# These are just random definitions, must be of type table requires
diagname = "DEFINE HERE"
username = "SOMEBODY"
project = "PROJECT NAME"
# Assuming you've defined your connection before
cursor.execute("""insert into TestNamesTable (TestName, TheUser, TheProject) values (:diagname, :username, :project)""",
"diagname": diagname, #cx_Oracle likes this bind-variable looking syntax
"username": username.
"project": project)
connection.commit()
【讨论】:
以上是关于SQL 插入适用于 Oracle SQL Developer,但不适用于 python的主要内容,如果未能解决你的问题,请参考以下文章
使用本机 SQL 创建表适用于 Hibernate/HSQLDB,插入失败。为啥?
我如何获取 SQL 中新插入的行的 PrimaryKey 值,该值应该适用于所有 SQL 库
AS 兼容性:“.. from T as a..”适用于 MySQL 和 SQL Server,而不适用于 Oracle? [复制]