SQL返回额外数据

时间:2009-11-04 10:11:16

标签: python sql mysql

嘿那里,想知道是否有人可以帮助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's来自哪里。我检查了SQL数据库,甚至重新加载它以确保。我已经恢复了最后一天的所有代码(所有代码都在运行),但仍无法找到解决方案。我也尝试过搜索,但我甚至不确定这个问题是什么,所以很难搜索。感谢任何人提供的任何帮助或信息。

4 个答案:

答案 0 :(得分:7)

我认为,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

这与您正在进行的操作相同(错误处理除外),但没有手动字符串格式化,转义等等。

我知道,这可能会被视为无关紧要,但如果这个答案有助于一个单个人开始使用正确的数据库api,那么真的很棒。

答案 1 :(得分:2)

2L是2的长版本:不同的对象,但值相同。

>>> print 2L == 2
True

>>> print 2L is 2
False

你是否正在运行(python,包,db,OS ......)?

答案 2 :(得分:1)

这是因为SQL中的数据类型是“长”吗?

正如您在元组中看到的那样,它们仍然是有效的数字,而不是字符串,所以这不会造成任何问题。

答案 3 :(得分:1)

L's表示这些数字是Long类型。 db中的字段类型可能设置为此类型。