Python 无法验证查询结果

Python 无法验证查询结果,python,Python,我在这里试图做的是,当数据库与某个IP地址匹配时,从数据库中获取serialno值。这个查询是否工作正常。应该是这样的,查询结果集rs为0。现在我尝试使用该值并在if-else构造中执行其他操作。基本上,我正在尝试根据ipaddress值检查数据库中的唯一值。但我得到了这个错误 query = "SELECT serialno from registeredpcs where ipaddress = " usercheck = query + "'%s'" %fromIP

我在这里试图做的是,当数据库与某个IP地址匹配时,从数据库中获取serialno值。这个查询是否工作正常。应该是这样的,查询结果集
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()等进行了一些清理。刚刚看到你的答案,我会进一步清理代码。真的很感谢你的指点:)