SQLite-запросы с Python: разные ошибки
Я действительно новичок в Python и пытаюсь запросить базу данных SQLite. Вот одна часть кода, с которой у меня проблемы:
def estadistiques(estacio='all',mes='all', graph=0):
if (len(mes)<2):
mes_sql = "0%s" %mes
else:
mes_sql = "%s" %mes
mesos = {"1":"Gener","2":"Febrer","3":"Març","4":"Abril","5":"Maig","6":"Juny","7":"Juliol","8":"Agost","9":"Setembre","10":"Octubre","11":"Novembre","12":"Decembre"}
if (estacio!='all'):
if (mes!='all'):
nom_estacio = cursor.execute("SELECT DISTINCT nom FROM estacions WHERE codi==?",[estacio]).fetchall()
mitjana_recarrega = cursor.execute("SELECT avg(recarrega) FROM dades WHERE strftime('%m', data)==? AND maquina IN (SELECT maquina FROM estacions WHERE codi==?)",(mes_sql, estacio)).fetchall()
mitjana_recuperat = cursor.execute("SELECT avg(recuperat) FROM dades WHERE strftime('%m', data)==? AND maquina IN (SELECT maquina FROM estacions WHERE codi==?)",(mes_sql, estacio)).fetchall()
mitjana_recaptat = cursor.execute("SELECT avg(recaptat) FROM dades WHERE strftime('%m', data)==? AND maquina IN (SELECT maquina FROM estacions WHERE codi==?)",(mes_sql, estacio)).fetchall()
print "-"*50
print "| Dades de l'estació %s durant el mes de %s" % (nom_estacio,mesos[mes])
print '-'*50
print '\n\n'
print 'Mitjana de recàrregues:\t\t %.2f' % mitjana_recarrega[0]
print 'Mitjana de recuperacions:\t %.2f' % mitjana_recuperat[0]
print 'Mitjana de recaptacions:\t %.2f' % mitjana_recaptat[0]
Я получаю эти параметры, используя raw_input
, Первый запрос:
nom_estacio = cursor.execute("SELECT DISTINCT nom FROM estacions WHERE codi==?",[estacio]).fetchall()
Хорошо работает, если у меня есть [estacio]
но если я напишу это без скобок estacio
Питон жалуется. Я понял, что это потому, что SQLite принимает эту переменную как кортеж.
Но по второму запросу я должен написать (mes_sql,estacio)
без скобок для работы. Если я положу его в скобки, я получу
sqlite3.InterfaceError: Ошибка привязки параметра 1 - возможно, неподдерживаемый тип.
Почему это происходит? Я решил эту проблему методом try-error, но я хотел бы знать, почему я должен делать это таким образом.
1 ответ
Я понял, что это потому, что SQLite принимает эту переменную как кортеж.
Как последовательность, на самом деле. (И DB-API, а не SQLite.) Так получилось, что список - это последовательность. Во втором случае это уже в последовательности, поэтому добавление скобок делает это неправильно.