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 返回额外数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 avg 和额外字段选择 jpql

如何使用 SQL 进行可选 JOIN

使用 LINQ to SQL,其中数据库表可以有额外的列

将“额外数据”添加到 LINQ to SQL 生成的实体?

额外的 XML 数据键值对到 SQL

MFP 7.0 HTTP 适配器返回额外数据