SQL 返回额外数据
Posted
技术标签:
【中文标题】SQL 返回额外数据【英文标题】:SQL returning extra data 【发布时间】:2009-11-04 10:11:16 【问题描述】:您好,想知道是否有人可以帮助 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
它用来打印这个:
EXISTS ((2, 'test@test.com', '1234', 1, 0, 2161, '192.168.1.47', 0),)
现在,它会打印: 它用来打印这个:
EXISTS ((2L, 'test@test.com', '1234', 1L, 0L, 2161, '192.168.1.47', 0L),)
我不知道这些 L 是从哪里来的。我检查了 SQL 数据库,甚至重新加载它以确定。我已经恢复了最后一天的所有代码(一切正常),但仍然找不到解决方案。我也尝试过搜索,但我什至不确定这个问题叫什么,所以很难搜索。感谢任何人可以提供的任何帮助或信息。
【问题讨论】:
【参考方案1】:我认为,python 的 dbapi 应该总是返回整数字段。
无论如何,10L、5L 等是 repr(在您的案例中用于元组的每个项目)长期工作的方式。
还有一件事。我明白了,你正在使用 MySQLdb。在这种情况下,我强烈建议您停止使用 c-api 包装器,而是使用“真实”接口,该接口具有所有自动转换/转义和一堆其他美妙的东西(一个是 dict-cursors)。
这将为您省去很多麻烦,并使您的代码更加稳定/安全。简而言之,忘记_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
这与您所做的相同(除了错误处理),但没有手动字符串格式化、转义等。
我知道,这可能会因为无关紧要而被否决,但如果这个答案甚至可以帮助 single 人开始使用 proper 数据库 api,那将真的很棒。
【讨论】:
哦,哇,没有意识到有一个不同的 MySQL 模块可以使用。我肯定会改用这种方式。感谢您的提醒。 :)【参考方案2】:2L 是 2 的长版本:不同的对象但相同的值。
>>> print 2L == 2
True
>>> print 2L is 2
False
你是否都在运行(python、packages、db、OS...)?
【讨论】:
哦,我明白了。是的,此后没有额外的包,或 python、操作系统或数据库本身的更改。奇怪的是,我确实有过时的代码,它执行几乎相同的查询并得到以下结果: (('2', 'test@test.com', '1234', '1', '0', '2165' , '192.168.1.47', '1'),) 我确信我的代码中有一些东西......某处。然而,我从来没有真正指定多头或任何让我困惑的东西。谢谢。 什么是数据库架构?什么是过时的代码,什么是新的代码【参考方案3】:这是因为 SQL 中的数据类型是“long”吗?
正如您在元组中看到的那样,它们仍然是有效数字,而不是字符串,因此这不会造成任何问题。
【讨论】:
【参考方案4】:L 表示数字的类型为 Long。您在数据库中的字段类型可能设置为这种类型。
【讨论】:
以上是关于SQL 返回额外数据的主要内容,如果未能解决你的问题,请参考以下文章