无法验证查询结果

时间:2016-02-08 11:49:52

标签: python

    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)

我在这里尝试做的是在匹配某个 ipaddress 时从db中获取 serialno 值。此查询是否正常工作。因为查询结果集rs应为0.现在我尝试使用该值并在if else构造中执行其他操作。基本上我试图根据 ipaddress 值检查数据库中的唯一值。但是我收到了这个错误

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])

我知道我犯了一些非常基本的错误。我认为它是导致错误的粗体部分。但是我无法指责它。我尝试使用rowcount()方法没有帮助。

2 个答案:

答案 0 :(得分:3)

rowcount是属性,不是方法;你不应该叫它。

答案 1 :(得分:1)

“我知道我犯了一些非常基本的错误”:好吧,Daniel Roseman同意你的主要错误的原因,但你的代码还有其他一些错误:

query = "SELECT serialno from registeredpcs where ipaddress = "
usercheck = query + "'%s'" % fromIP
rs = cursor.execute(usercheck)

这部分很难阅读(你没有充分理由使用字符串连接和字符串格式化),脆弱(尝试使用`fromIP =“'foo'”)和very very unsafe。您想要使用参数化查询,即:

# 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)
  

“因为查询结果集rs应为0”

这实际上是完全错误的。 cursor.execute()返回查询影响(选择,创建,更新,删除)的行数。 “结果集”实际上就是光标本身。您可以使用cursor.fetchone()cursor.fetall()或更简单地获取结果(如果您希望使用常量内存使用整个结果集,则更有效)通过遍历cursor,即:

for row in cursor:
    print row

让我们继续您的代码:

row = rs
if int(row) == 1:
  # ...    
elif int(row) == 0:
  # ...

第一行是无用的 - 它只会使row成为rs的别名,并且命名错误 - 它是“行”(来自您的一行结果)查询),它是int。由于它已经是int,因此将其转换为int也毫无用处。最后,除非'ipadress'是表中的唯一键,否则您的查询可能会返回多行。

如果你想要的是匹配serialno的记录的fromIP字段的有效值,你必须获取行:

row = cursor.fetchone() # first row, as a tuple

然后获取值,在这种情况下将是行中的第一项:

serialno = row[0]