嘿那里,想知道是否有人可以帮助SQL和Python的新手.我以为自己对它有了相当不错的把握,但最近发生了一些奇怪的事情.
以下是从较大部分剪切的以下代码:
try:
self.db.query("SELECT * FROM account WHERE email = '{0}' AND pass = '{1}'".format(self.mail.strip(self.bchars),self.pw.strip(self.bchars)))
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
exists = self.db.store_result().fetch_row()
print "EXISTS",exists
Run Code Online (Sandbox Code Playgroud)
它用来打印这个:
EXISTS ((2, 'test@test.com', '1234', 1, 0, 2161, '192.168.1.47', 0),)
Run Code Online (Sandbox Code Playgroud)
现在,它打印出来:它用来打印这个:
EXISTS ((2L, 'test@test.com', '1234', 1L, 0L, 2161, '192.168.1.47', 0L),)
Run Code Online (Sandbox Code Playgroud)
我不知道这些L's来自哪里.我检查了SQL数据库,甚至重新加载它以确保.我已经恢复了最后一天的所有代码(所有代码都在运行),但仍无法找到解决方案.我也尝试过搜索,但我甚至不确定这个问题是什么,所以很难搜索.感谢任何人提供的任何帮助或信息.
我认为,python的dbapi应该总是返回整数字段.
无论如何,10L,5L等是repr(在你的情况下用于元组的每个项目)的方式适用于longs.
还有一件事.我明白了,你正在使用MySQLdb.在这种情况下,我强烈建议你停止使用c-api包装器,而是使用"真正的"接口,它具有所有自动转换/转义和一堆其他奇妙的东西(dict-cursors for one).
这将为您节省很多麻烦,并使您的代码更加稳定/安全.简而言之,只要忘记_mysql.相信我.
您的示例可以重写为此(使用适当的界面):
import MySQLdb
db = MySQLdb.connect(host=your_host, db=your_db,
user=your_user, passwd=your_password)
cur = db.cursor()
cur.execute("""SELECT * FROM account WHERE email = %s AND pass = %s """,
(self.mail, self.pw))
result = cur.fetchall()
print "exists:", result
Run Code Online (Sandbox Code Playgroud)
这与您正在执行的操作相同(错误处理除外),但没有手动字符串格式化,转义等等.
我知道,这将是downvoted的无关,可能是,但如果这个答案可以帮助甚至一个单一的人开始使用适当的数据库API,这将是真正伟大的.