2016-08-23 68 views
0
创建SQLite视图

我创建了一个数据库,我能够使用下面的命令来创建一个简单的观点:不能使用列名列表在Python

CREATE VIEW IF NOT EXISTS monthly_terminals (year, month) AS 
    SELECT reportYear, reportMonth FROM osMonthlyTerminals 

此命令的工作就好了,如果我粘贴成在Firefox上的SQLite Manager插件:

enter image description here

然后我放弃这一观点,并尝试使用完全相同的命令,在下面的Python 3代码来创建这个观点......

import sqlite3 
db_name = "../data/OsReportMerchants.sqlite" 
conn = sqlite3.connect(db_name) 
cur = conn.cursor() 
cur.execute("CREATE VIEW IF NOT EXISTS monthly_terminals (year, month) AS SELECT reportYear, reportMonth FROM osMonthlyTerminals") 

...但我得到以下错误:

sqlite3.OperationalError: near "(": syntax error 

更具体地说,它看起来像这样在IPython中:

enter image description here

是的,我知道我应该被参数化这我曾试图这样做,但仍继续陷入同样的​​困境。

我看这个:https://www.sqlite.org/lang_createview.html它说列名单在3.9及更高版本中被支持,所以我更新到版本3.13的sqlite3,并且仍然遇到这个问题。

当我删除列的列表,并使用此:

import sqlite3 
db_name = "../data/OsReportMerchants.sqlite" 
conn = sqlite3.connect(db_name) 
cur = conn.cursor() 
cur.execute("CREATE VIEW IF NOT EXISTS monthly_terminals AS SELECT reportYear, reportMonth FROM osMonthlyTerminals") 

它工作正常。不知道为什么它在一种情况下,而不是在另一种情况下。

回答

1

Python拥有自己的SQLite库副本(请参阅sqlite3.sqlite_version)。

如果最新的Python版本没有最新版本的SQLite,更新它的唯一方法是重新编译Python,或者使用一些其他数据库驱动程序,如APSW

+0

当我做conda列表时,它显示sqlite 3.13.0。当我从python shell执行sqlite3.version(在导入sqlite3之后)时,它说2.6.0。这似乎让我感到困惑(也许是因为我对Python比较陌生)。所以看起来FireFox插件使用的是更新版本,我的Python代码使用的是旧版本。这是怎么回事? –

+0

看到我答案的第一句话。 –