繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM