SQL返回额外数据

Chu*_*uck 1 python mysql sql

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

shy*_*ent 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
Run Code Online (Sandbox Code Playgroud)

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

我知道,这将是downvoted的无关,可能是,但如果这个答案可以帮助甚至一个单一的人开始使用适当的数据库API,这将是真正伟大的.