我创建一个连接到mysql的python程序.
我需要检查一个表是否包含数字1,以表明它已成功连接,这是我的代码到目前为止:
xcnx.execute('CREATE TABLE settings(status INT(1) NOT NULL)')
xcnx.execute('INSERT INTO settings(status) VALUES(1)')
cnx.commit()
sqlq = "SELECT * FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
results = xcnx.fetchall()
if results =='1':
print 'yep its connected'
else:
print 'nope not connected'
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我是一个sql noob,谢谢你们.
jdi*_*jdi 15
我相信最有效的"它存在"查询只是做一个count:
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
Run Code Online (Sandbox Code Playgroud)
而不是要求数据库对字段或行执行任何计数操作,而只是要求它返回1或0,如果结果产生任何匹配.这样可以更有效地返回实际记录并计算客户端数量,因为它可以节省双方的序列化和反序列化以及数据传输.
In [22]: c.execute("select count(1) from settings where status = 1")
Out[22]: 1L # rows
In [23]: c.fetchone()[0]
Out[23]: 1L # count found a match
In [24]: c.execute("select count(1) from settings where status = 2")
Out[24]: 1L # rows
In [25]: c.fetchone()[0]
Out[25]: 0L # count did not find a match
Run Code Online (Sandbox Code Playgroud)
count(*)将会是一样的count(1).在您的情况下,因为您正在创建一个新表,它将显示1个结果.如果你有10,000个匹配,它将是10000.但你在测试中关心的是它是否不是0,所以你可以执行bool真值测试.
更新
实际上,使用rowcount甚至更快,甚至没有获取结果:
In [15]: if c.execute("select (1) from settings where status = 1 limit 1"):
print True
True
In [16]: if c.execute("select (1) from settings where status = 10 limit 1"):
print True
In [17]:
Run Code Online (Sandbox Code Playgroud)
这也是django的ORM如何做到的queryObject.exists().