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()
方法没有帮助。
答案 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]