如何在python中传递sql语句的变量?

时间:2012-05-08 15:56:17

标签: python database

我是python的初学者。我正在对访问数据库进行查询。我是将一个字符串变量传递给sql语句,但无法弄清楚是否为double。

这是我的代码:

qllname = 29221.0

llname = "01-01-05-W2"

sqlstatement = recordset.Open("SELECT * FROM LLD WHERE LLD = '%s'" % (llname),connection,1,3)

for x in range(recordset.Fields.Count):

    fields_dict[x] = recordset.Fields.Item(x).Name

    print fields_dict[x], recordset.Fields.Item(x).Value, x


sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3)

for x2 in range(recordset2.Fields.Count):

    print recordset2.Fields.Item(x2).Value, type(recordset2.Fields.Item(x2).Value)

结果:

LLD 01-01-05-W2 0
X 678817.81875 1
Y 5431052.45982 2
Traceback (most recent call last):
  File "L:/temporary/start of test/accessnew--.py", line 25, in <module>
    sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3)
  File "<COMObject ADODB.Recordset>", line 4, in Open
com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft JET Database Engine', u'Data type mismatch in criteria expression.', None, 5003071, -2147217913), None)
>>> 

2 个答案:

答案 0 :(得分:3)

尝试:

sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3)

您正在使用%d字符串插值运算符,它告诉我您正在将数字传递给SQL语句。但是,当我认为您需要一个整数时,您使用SQL字符串。我想你想要一个看起来像 -

的SQL语句
SELECT * FROM SWAWELLS WHERE WWDR_NO = 29221

但是,您提供的代码将生成此声明:

SELECT * FROM SWAWELLS WHERE WWDR_NO = '29221'

如果WWDR_NO是一个整数,那么您将获得上面收到的“条件表达式中的数据类型不匹配”。

试试这个:

# Notice there is no ' around %d
sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS "
                                "WHERE WWDR_NO = %d" % 
                                (qllname),connection2,1,3)

另外,正如其他人提到的那样,你应该使用DBAPI包装器。那是什么? DB-API是用于访问数据库的python“标准”。有一个名为adodbapi的ACCESS可用。我不知道这个库的状态。人们说远离上面所做插值的原因是因为它可以构建无效的SQL,如果你从不受信任的来源获取数据,则存在安全风险。

使用dbapi的其他 BIG 好处是它是一个标准。如果你给它一个旋转,你的代码将合理地移植到其他数据库。

想立即查看DBAPI而无需下载库吗?如果你使用py2.5或更高版本,你可以使用sqlite内置它。查看sqlite3模块here

答案 1 :(得分:2)

您不应使用%格式化运算符。这是不安全的。

这是Python数据库API规范v2.0 http://www.python.org/dev/peps/pep-0249/

大多数python DB包装器都支持它。