Наблюдаю некоторое странное поведение с SQLite 2.6, где ROW_NUMBER()
выдает ошибку только в Google Colab (Python 3.6.9), тогда как код отлично работает в моих локальных экземплярах Python 3.6.9 и Python 3.9.1. Можете ли вы помочь мне отладить это дальше?
Код
import sqlite3, sys
try:
print('Py.version : ' + (sys.version))
print('sqlite3.version : ' + (sqlite3.version))
print('sqlite3.sqlite_version : ' + (sqlite3.sqlite_version)+'\n')
conn = sqlite3.connect(':memory:')
conn.execute('''CREATE TABLE team_data(team text, total_goals integer);''')
conn.commit()
conn.execute("INSERT INTO team_data VALUES('Real Madrid', 53);")
conn.execute("INSERT INTO team_data VALUES('Barcelona', 47);")
conn.commit()
sql='''
SELECT
team,
ROW_NUMBER () OVER (
ORDER BY total_goals
) RowNum
FROM
team_data
'''
print('### DB Output ###')
cursor = conn.execute(sql)
for row in cursor:
print(row)
except Exception as e:
print('ERROR : ' + str(e))
finally:
conn.close()
Выход
Py.version : 3.6.9 (default, Oct 8 2020, 12:12:24) [GCC 8.4.0]
sqlite3.version : 2.6.0
sqlite3.sqlite_version : 3.22.0
### DB Output ###
ERROR : near "(": syntax error
Py.version : 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 14:00:49) [MSC v.1915 64 bit (AMD64)]
sqlite3.version : 2.6.0
sqlite3.sqlite_version : 3.33.0
### DB Output ###
('Barcelona', 1)
('Real Madrid', 2)
Py.version : 3.9.1 (default, Dec 11 2020, 09:29:25) [MSC v.1916 64 bit (AMD64)]
sqlite3.version : 2.6.0
sqlite3.sqlite_version : 3.33.0
### DB Output ###
('Barcelona', 1)
('Real Madrid', 2)
Примечание. Приведенный выше SQL и код упрощены только для целей воспроизведения ошибок.
@AllanWind - Да, я пробовал с пробелами и без них.
Является ли sqlite3.sqlite_version одинаковым в двух средах? Я вижу версии пакетов. В частности, оконные функции согласно документации были добавлены в 3.25.0.
Оконные функции были представлены в версии 3.25.0 SQLite: sqlite.org/windowfunctions.html#history. Проверьте версию SQLite, которую использует Google Colab, выполнив select sqlite_version();
.
Спасибо AllanWind и @forpas! Увидев ту же версию пакета 2.6, я сначала смутился... теперь понял
Рассматриваемый запрос является оконной функцией, поддержка которой была добавлена в версии 3.25. Вы можете проверить версию библиотеки (в отличие от пакета) с помощью sqlite3.sqlite_version или как @forpas поделился с запросом select sqlite_version()
.
Спасибо! Мне придется подождать, пока Google Colab обновит свою версию sqlite.
Вы можете обновить свою версию sqlite. Используйте этот код.
!add-apt-repository -y ppa:sergey-dryabzhinsky/packages
!apt update
!apt install sqlite3
# MENU: Runtime > Restart runtime
import sqlite3
sqlite3.sqlite_version # '3.33.0'
Спасибо. Но это Google Colab, которому нужно обновить свою версию sqlite.
Colab теперь использует Ubuntu 18,04, которая никогда не будет использовать sqlite 3.33.0. Вам нужно подождать, пока они не обновят Ubuntu до 20.04, что, я думаю, произойдет в 2022 году.
Пробовали ли вы удалить пробел между ROW_NUMBER и ()?