[英]How to pass variables for sql statements in python?
我是python的初学者。 我正在对访问数据库进行查询。 我是将字符串变量传递给sql语句,但无法弄清楚它是否是两倍。
这是我的代码:
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)
>>>
尝试:
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“标准”。 ACCESS有一种名为adodbapi的可用。 我不知道这个库的状态。 人们说远离上面所做的插值的原因是因为它可能生成无效的SQL,如果您从不受信任的来源获取数据,则存在安全风险。
使用dbapi
的另一大好处是它是标准的。 如果您愿意,可以将您的代码合理地移植到其他数据库中。
是否想在不下载库的情况下立即签出DBAPI? 如果您使用的是py2.5或更高版本,则可以使用sqlite内置。 在此处检查sqlite3模块。
您不应该使用%
格式运算符。 这是不安全的。
这是Python数据库API规范v2.0 http://www.python.org/dev/peps/pep-0249/
大多数python DB包装器都支持它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.