Python 无法验证查询结果
我在这里试图做的是,当数据库与某个IP地址匹配时,从数据库中获取serialno值。这个查询是否工作正常。应该是这样的,查询结果集Python 无法验证查询结果,python,Python,我在这里试图做的是,当数据库与某个IP地址匹配时,从数据库中获取serialno值。这个查询是否工作正常。应该是这样的,查询结果集rs为0。现在我尝试使用该值并在if-else构造中执行其他操作。基本上,我正在尝试根据ipaddress值检查数据库中的唯一值。但我得到了这个错误 query = "SELECT serialno from registeredpcs where ipaddress = " usercheck = query + "'%s'" %fromIP
rs
为0。现在我尝试使用该值并在if-else构造中执行其他操作。基本上,我正在尝试根据ipaddress值检查数据库中的唯一值。但我得到了这个错误
query = "SELECT serialno from registeredpcs where ipaddress = "
usercheck = query + "'%s'" %fromIP
#print("query"+"-"+usercheck)
print(usercheck)
rs = cursor.execute(usercheck)
print(rs)
row = rs
#print(row)
#rs = cursor.rowcount()
if int(row) == 1:
query = "SELECT report1 from registeredpcs where serialno = "
firstreport = query + "'%s'" %rs
result = cursor.execute(firstreport)
print(result)
elif int(row) == 0:
query_new = "SELECT * from registeredpcs"
cursor.execute(query_new)
newrow = cursor.rowcount()+1
print(new row)
我知道我犯了一些非常基本的错误。我认为是粗体部分导致了错误。但我就是不能把我的手指放在上面。我尝试使用
rowcount()
方法没有帮助。rowcount
是一个属性,而不是一个方法;你不应该这样称呼它。我知道我犯了一些非常基本的错误:丹尼尔·罗斯曼(Daniel Roseman)已经解决了你主要错误的原因,但你的代码中还有几个其他错误:
error: uncaptured python exception, closing channel smtpd.SMTPChannel connected
192.168.1.2:3630 at 0x2e47c10 (**class 'TypeError':'int' object is not
callable** [C:\Python34\lib\asyncore.py|read|83]
[C:\Python34\lib\asyncore.py|handle_read_event|442]
[C:\Python34\lib\asynchat.py|handle_read|171]
[C:\Python34\lib\smtpd.py|found_terminator|342] [C:/Users/Dev-
P/PycharmProjects/CR Server Local/LRS|process_message|43])
for row in cursor:
print row
这部分内容很难阅读(您使用字符串连接和字符串格式是没有充分理由的)、很脆弱(请使用'fromIP=“'foo'”尝试这一部分),以及。您希望改用参数化查询,即:
query = "SELECT serialno from registeredpcs where ipaddress = "
usercheck = query + "'%s'" % fromIP
rs = cursor.execute(usercheck)
“应为,查询结果集rs为0”
这其实是完全错误的cursor.execute()
返回受查询影响(选择、创建、更新、删除)的行数。“结果集”实际上就是光标本身。您可以使用cursor.fetchone()
,cursor.fetall()
,或者通过迭代光标
,更简单地获取结果(如果您希望使用恒定内存使用处理整个结果集,则效率更高),即:
# nb check your exact db-api module for the correct placeholder,
# MySQLdb uses '%s' but some other use '?' instead
query = "SELECT serialno from registeredpcs where ipaddress=%s"
params = [fromIP,]
rs = cursor.execute(query, params)
让我们继续您的代码:
error: uncaptured python exception, closing channel smtpd.SMTPChannel connected
192.168.1.2:3630 at 0x2e47c10 (**class 'TypeError':'int' object is not
callable** [C:\Python34\lib\asyncore.py|read|83]
[C:\Python34\lib\asyncore.py|handle_read_event|442]
[C:\Python34\lib\asynchat.py|handle_read|171]
[C:\Python34\lib\smtpd.py|found_terminator|342] [C:/Users/Dev-
P/PycharmProjects/CR Server Local/LRS|process_message|43])
for row in cursor:
print row
第一行没有用-它只使row
成为rs
的别名,而且名称不正确-它不是“row”(查询结果的一行),而是int
。由于它已经是一个int
,因此将其转换为int
也是无用的。最后,除非“ipAddress”是表中的唯一键,否则查询可能返回多行
如果您想要的是与fromIP
匹配的记录的serialno
字段的有效值,则必须获取行:
然后获取值,在本例中,该值将是行中的第一项:
row = cursor.fetchone() # first row, as a tuple
谢谢:)成功了。谢谢布鲁诺,这真的很有帮助。我知道代码是劣质的,实际上我正在做很多事情来找出主要错误的原因,因此有很多不必要的代码。对serialno使用fetchone()等进行了一些清理。刚刚看到你的答案,我会进一步清理代码。真的很感谢你的指点:)