在我的Python应用程序中,我一直使用sqlite3.Row作为行工厂,按名称索引结果一段时间没有问题。最近我将我的应用程序移动到一个新的服务器(没有代码更改),并且我发现这种索引方法现在意外地在新服务器上出现了非常特殊的情况。我看不出任何解释。
当我的select查询中包含DISTINCT
关键字时,新服务器上似乎出现了问题:
import sqlite3
conn = sqlite3.connect(':memory:')
conn.row_factory = sqlite3.Row
c = conn.cursor()
c.execute('create table test ([name] text)')
c.execute("insert into test values ('testing')")
conn.commit()
c.execute('select [name] from test')
row = c.fetchone()
print row['name'] # works fine on both machines
c.execute('select distinct [name] from test') # add distinct keyword
row = c.fetchone()
print row['name'] # fails on new server (no item with that key)
正如您所看到的,我能够使用内存数据库来解决此问题,因此问题与我现有的数据无关。这两台机器都是基于Debian的(旧版:Ubuntu 8.10,新版:Debian 5.0.3),两台机器都运行Python 2.5.2。我相信sqlite3模块是Python安装的核心部分,所以我不知道这个细微的破坏是如何发生的,因为python版本是相同的。
有没有人有任何想法,或者以前见过这样的事情?
谢谢,
克里斯
答案 0 :(得分:1)
尝试添加行
print row.keys()
而不是“print row ['name']”,以查看第二种情况下第0列的实际名称(可能由“DISTINCT”关键字改变)。
或者你可以在这种情况下使用row [0],但这很可能不是你想要的。 :)
答案 1 :(得分:0)
我遇到了一个不同但相似的问题,但是在搜索“ indexerror没有那个键的项目”后,我想到了这个问题。在我的情况下,问题是不同的sqlite版本似乎在row_factory = sqlite3.Row模式下以不同方式处理行键名。在sqlite 3.24.0中,查询如下:
select table.col
from table
...在行字典中创建一个键,如col
。但是较早的版本似乎使用合格的密钥,例如table.col
。提供一个显式别名或不限定该列是一种解决方法。例如:
select table.col as "col"
from table
或者:
select col
from table