Sqlite error unrecognized token

Как правильно записать данные в БД (ошибка sqlite3.OperationalError: unrecognized token) Python Решение и ответ на вопрос 2686223

Михалыч

687 / 293 / 54

Регистрация: 28.02.2013

Сообщений: 838

1

01.08.2020, 15:17. Показов 11334. Ответов 4

Метки нет (Все метки)


Добрый день! У меня есть база данных:

Python
1
2
3
            cursorObj.execute("""CREATE TABLE objects(id INTEGER PRIMARY KEY, data TEXT NOT NULL,
                                                                 photo BLOB NOT NULL, name_photo TEXT NOT NULL,
                                                                 scale_photo TEXT NOT NULL)""")

Я хочу в data записать значения словаря приведенного к str:

Python
1
2
3
                sql = 'UPDATE objects SET data = "' + str(self.data_obj) + '" where id = ' + str(row[0])
                cursorObj.execute(sql)
                sqliteConnection.commit()

И вот когда мой словарь self.data_obj содержит обычный словарь «ключ-значение» то все нормально, а вот когда в значениях появляются вложенные словари он выдает ошибку

sqlite3.OperationalError: unrecognized token: «{«



0



0x10

3254 / 2056 / 351

Регистрация: 24.11.2012

Сообщений: 4,909

01.08.2020, 16:02

2

Лучший ответ Сообщение было отмечено Михалыч как решение

Решение

Нельзя же собирать запрос конкатенацией строк.

Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack (see https://xkcd.com/327/ for humorous example of what can go wrong).

Instead, use the DB-API’s parameter substitution.
[…]

Python
1
2
3
4
5
6
7
8
9
# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
 
# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print(c.fetchone())
[...]

https://docs.python.org/3/library/sqlite3.html



1



Михалыч

687 / 293 / 54

Регистрация: 28.02.2013

Сообщений: 838

02.08.2020, 09:29

 [ТС]

3

Цитата
Сообщение от 0x10
Посмотреть сообщение

Нельзя же собирать запрос конкатенацией строк.

До этого работало) Я же правильно понимаю, что если 2 переменные то должно быть 2 знака вопроса (под рукой пока той программы нет, а то бы давно попробовал, а любопытство распирает), т.е. примерно так:

Python
1
2
3
data = str(self.data_obj) 
tmp_id = str(row[0])
cursorObj.execute('UPDATE objects SET data = ? where id = ?', data, tmp_id)



0



3254 / 2056 / 351

Регистрация: 24.11.2012

Сообщений: 4,909

02.08.2020, 09:32

4

Цитата
Сообщение от Михалыч
Посмотреть сообщение

Я же правильно понимаю, что если 2 переменные то должно быть 2 знака вопроса

Да, только execute принимает два аргумента: строку и кортеж.



1



687 / 293 / 54

Регистрация: 28.02.2013

Сообщений: 838

02.08.2020, 09:38

 [ТС]

5

0x10, Спасибо



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

02.08.2020, 09:38

Помогаю со студенческими работами здесь

Ошибка при разборе запроса. [ Token line number = 1,Token line offset = 26,Token in error = Наименование ]
Доброго времени суток, никак не пойму в чем проблема.
using System;
using…

Как правильно записать данные в Json
Доброго времени суток, возникла такая проблема.

Имеется массив объектов типа:

dataDocument…

Как правильно записать данные в List?
Пишу программу для создания тестов.
Первый класс

class Answer
{
public String…

Как правильно записать данные в файл PHP
Доброе утро. При попытке записать данные в файл, у меня в файл записывается сначала имя, а потом…

Как правильно записать данные из StringBuilder в combobox?
comboBox2.Items.Add(sb);
Если писать так то все что есть в StringBuilder sb будет записано в одну…

Как правильно записать данные в массив файла
Добрый вечер!
Пишу программу работы с файлами(то есть создать, открыть, сохранить, заполнить,…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

5

Содержание

  1. unrecognized token error #1270
  2. Comments
  3. Details for the issue
  4. Useful extra information
  5. I’m opening this issue because:
  6. I’m using DB4S on:
  7. I’m using DB4S version:
  8. I have also:

unrecognized token error #1270

Details for the issue

Selecting values in double quotes containing double hyphen substring returns «unrecognized token» error.

Please see example below.
—Error unrecognized token:
select «anything—something»

—no error
select ‘anything—something’

I’m opening this issue because:

  • DB4S is crashing
  • DB4S has a bug
  • DB4S needs a feature
  • DB4S has another problem

I’m using DB4S on:

  • Windows: ( version: ___ )
  • Linux: ( _distro:Ubuntu )
  • Mac OS: ( version: ___ )
  • Other: ___

I’m using DB4S version:

I have also:

  • Tried out the latest nightly version: https://github.com/sqlitebrowser/sqlitebrowser#nightly-builds
  • Searched for an existing similar issue: https://github.com/sqlitebrowser/sqlitebrowser/issues?utf8=%E2%9C%93&q=is%3Aissue%20

The text was updated successfully, but these errors were encountered:

Ouch, that definitely sounds like a bug. Have you tried any of the commits prior to that, to see if that’s the one which introduces it?

The same error with version 3.10.99 from 2017-12-09, I see on my system. Thank you for looking into it.

Oops. Just realised something that should have been obvious to me right away before.

This is probably not a bug after all. With SQL, the single and double quote characters aren’t the same thing.

  • Single quote characters ‘ are used to start and end strings. eg:
  • Double quote characters » are used to start and end identifiers (such as field names). eg:

In the above example, the table bar contains a field called my field with spaces in its name .

Further reference info, in case it’s useful:

With your double quote example, the «unrecognized token» message is probably meaning that it’s looking for a field called (literally) «anything—something», and not finding it. 😉

Thank you for pointing to SQLite documentation.
I have bumped into this while operating with strings already containing single quotes.
It seems that official sqlite3 command line tool does not produce «unrecognized token» error.
Thanks anyway.

Hmmm, yeah you’re right. I’ve just tried it here with the sqlite3 client (and older version, 3.7.17 on my CentOS 7 desktop), and a recent build of DB4S.

It looks like DB4S is getting misunderstanding the double quotes. For example, with this (from above):

In the sqlite3 CLI it works, adding a new row into the table bar . DB4S gives this error instead:

Looking at that error message, there’s an extra » at the start of the TEXT2 string. Guessing here, but this looks like we’re somehow getting the quotes wrong after all.

So. yep this does seem like a bug. Our Execute SQL tab should accept anything that the SQLite CLI does. Thanks for being persistent. 😀

Источник

Я использую Unity, вот небольшой фрагмент моего кода. Все, что я хочу сделать, это поместить data.token и data.expire в SQLite. По какой-то причине он продолжает бросать мне ошибку, которая:

SqliteException: SQLite error
unrecognized token: "587503bc773a565d52401c87"
Mono.Data.Sqlite.SQLite3.Prepare (Mono.Data.Sqlite.SqliteConnection cnn, System.String strSql, Mono.Data.Sqlite.SqliteStatement previous, UInt32  timeoutMS, System.String& strRemain)
Mono.Data.Sqlite.SqliteCommand.BuildNextCommand ()

Я понятия не имею, как токен непризнан. В SQLite поле Token является STRING а поле ExpireINTEGER.

IncomingTokenData data = IncomingTokenData.CreateFromJSON(www.text);

string conn = "URI=file:" + Application.dataPath + "/MyDataBase.s3db"; //Path to database.
var sqlQuery = "INSERT INTO MyDataBase(Token, Expire) VALUES(" + data.token +", " + data.expire + ")";

if(!string.IsNullOrEmpty(www.error)) {
    ErrText.text = "Error: " + www.error;
}else{
    if(data.pass == "1"){
        IDbConnection dbconn;
        dbconn = (IDbConnection) new SqliteConnection(conn);
        dbconn.Open(); //Open connection to the database.
        IDbCommand dbcmd = dbconn.CreateCommand();
        dbcmd.CommandText = sqlQuery;
        dbcmd.ExecuteNonQuery();

10 янв. 2017, в 17:24

Поделиться

Источник

1 ответ

В SQL-запросах вы должны заключать строковые значения в одинарные кавычки (в этом случае размещать кавычки вокруг data.token):

var sqlQuery = "INSERT INTO MyDataBase(Token, Expire) VALUES('" + data.token +"', " + data.expire + ")";

Обратите внимание, что конкатенация строк не лучший способ для создания SQL-запросов — более надежный способ избежать этих проблем — использовать заполнители, например встроенные функции IDbCommand для добавления параметров:

var sqlQuery = "INSERT INTO MyDataBase(Token, Expire) VALUES(@token, @expire)";

if(!string.IsNullOrEmpty(www.error)) {
    ErrText.text = "Error: " + www.error;
}else{
    if(data.pass == "1"){
        IDbConnection dbconn;
        dbconn = (IDbConnection) new SqliteConnection(conn);
        dbconn.Open(); //Open connection to the database.
        IDbCommand dbcmd = dbconn.CreateCommand();
        dbcmd.Parameters.Add("@token", SqlDbType.VarChar).Value = data.token;
        dbcmd.Parameters.Add("@expire", SqlDbType.Int).Value = data.expire;
        dbcmd.CommandText = sqlQuery;
        dbcmd.ExecuteNonQuery();

Используя этот метод, значения правильно форматируются в соответствии с их типом данных.

Serlite
10 янв. 2017, в 16:55

Поделиться

Ещё вопросы

  • 1не может запустить ноутбук Jupyter от Anaconda, но может запустить его из Python
  • 1Поперечная операция не действительна
  • 0Magento php расчет по цене
  • 0Странная проблема с указателями… построение BST с использованием массива указателей
  • 0Функция стиля нг и встроенный вместе
  • 0jQuery Назад Кнопка OnLond событие?
  • 1Разделить столбец (разделитель) в Pandas DataFrame; длина столбцов равна ошибке ключа
  • 0Переполнение CloudZoom скрыто
  • 1Печать всех вхождений сопоставленных данных из 2 кадров данных в пандах
  • 0Лучший вариант? Действия запроса MySQL
  • 1Как исправить это исключение java.lang.String не может быть приведен к пользовательскому типу
  • 1Поднимите все вхождения типа во вложенном словаре до ключа верхнего уровня
  • 0Упрощение MySQL Query для удаления нескольких выборок в операторе Where
  • 0Почему динамическое поле выбора JSON не работает?
  • 1Добавить разбор функции в простой разбор с нечисловыми аргументами
  • 0Как вы получаете старые и новые значения динамического автозаполнения md-selected-item-change (Angular Material)?
  • 1Реверсировать массив вручную
  • 1Лог-вычисления в Python
  • 1Я не могу изменить цвет угла ScrollPane в JavaFX
  • 0Выберите HTML изменить другой выберите HTML из функции обмена
  • 1Как использовать функцию расширения в другом классе? C #
  • 1Вопрос макета — как начать действие, не перемещая определенные элементы интерфейса?
  • 0Когда отправляете редактировать, значение становится пустым из диалога
  • 0Как вставить данные в таблицу MySQL, используя sequeilze в express.js
  • 0Инициализация колоды с использованием Юникода
  • 0Конвертировать INT во ВРЕМЯ, используя JS
  • 0Использование SWIG для возврата Byte [], вызывающего jvm для segv при выходе
  • 0динамический объект массива json
  • 1Java: Можем ли мы повторно использовать MBeanServerConnection без каких-либо проблем?
  • 1CORS включен, но все равно получает 405
  • 0$ ionicHistory.clearHistory очищает историю, но переходит к предыдущему представлению, когда hardwareBackButton нажал на Android?
  • 1Android OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины
  • 0PHP str_ireplace на Mysql Результат
  • 1Отображение значений внутри столбца панд
  • 1Почему исключение класса считается небезопасной операцией?
  • 0ngmap для маркеров на карте Google
  • 0Как отключить все поля формы, кроме кнопок, используя JavaScript
  • 0Встроенный шрифт в изображение base64
  • 0Добавить значение из поля ввода в пользовательский параметр href
  • 0Имя пользователя Восстановление пароля
  • 0php — объект ловит данные об ошибке при отсутствии атрибутов
  • 1Нерыночная публикация контента
  • 0Полноэкранный слайд страницы с навигацией
  • 1Проблема SAXParser при получении значения тега с символом &
  • 1Разбор JSON с неопределенным значением
  • 0Загрузить файл JSON из вложенного массива
  • 0Прокрутка тела Flexslider только для текущего слайда (V2)
  • 1поиск слова документа в c #
  • 1Сборщик мусора для Android в Лунном Ландере
  • 1Автозаполнение материала Angular 2 — получить (действительный) выбранный элемент

Сообщество Overcoder

 python, sqlite


0

1

В общем пытаюсь добавить картинку в поле блоба, а в ответ получаю это.
Вот код:

img = open(self.filepath.text(), 'rb')
blob = img.read()

base.execute("INSERT INTO album (id, image) VALUES(Null, {})"
		.format( sqlite3.Binary(blob)))

В чем я ошибся?

  • Ссылка

Ответ на:

комментарий
от deterok 29.06.12 10:37:34 MSK

"INSERT INTO album (id, image) VALUES(Null, '{}')"

Гуглить мама в детстве не учила?

jessey

(29.06.12 10:40:21 MSK)

  • Показать ответы
  • Ссылка

Ответ на:

комментарий
от jessey 29.06.12 10:40:21 MSK

Да вроде пробовал, приеду еще раз попробую

deterok ★★★★★

(29.06.12 10:44:42 MSK)

  • Ссылка

Ответ на:

комментарий
от baverman 29.06.12 10:50:07 MSK

Я ни в одном tutorial’е или документации не видел, чтобы параметры подставлялись строкой. Везде используют связывание параметров. Откуда же тогда берутся люди, которые стреляют себе в ногу?

i-rinat ★★★★★

(29.06.12 11:01:40 MSK)

  • Показать ответ
  • Ссылка

Ответ на:

комментарий
от i-rinat 29.06.12 11:01:40 MSK

Я бы наоборот даже сказал, во всех туториалах, что я видел, жирным шрифтом выделено — никогда так не делать!

hippi90 ★★★★★

(29.06.12 12:50:59 MSK)

  • Показать ответ
  • Ссылка

Ответ на:

комментарий
от hippi90 29.06.12 12:50:59 MSK

Ответ на:

комментарий
от jessey 29.06.12 10:40:21 MSK

Ответ на:

комментарий
от deterok 29.06.12 15:47:12 MSK

base.execute("INSERT INTO album (id, image) VALUES(Null, ?)", (sqlite3.Binary(blob),))

beka

(04.07.12 19:56:45 MSK)

  • Ссылка

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.

Похожие темы

  • Форум
    bash+sqlite3 (2015)
  • Форум
    Как составить такой sql запрос? (2012)
  • Форум
    bash, sqlite3, insert. (2008)
  • Форум
    C/SQLite что за ошибка (2015)
  • Форум
    [mysql] Чудо (2010)
  • Форум
    тупилово (2008)
  • Форум
    [postrgesql] переупорядочить таблицу (2008)
  • Форум
    Маленький совет по SQL-запросу (2016)
  • Форум
    INSERT … ON CONFLICT DO UPDATE … RETURNING id (2016)
  • Форум
    Как бороться с «unable to close due to unfinalised statements» (2012)

Понравилась статья? Поделить с друзьями:
  • Sql state hy010 function sequence error
  • Sql state 72000 error code 12899
  • Sql state 08001 sql error code 53
  • Sql standard database services unknown msi error code 43 wincc
  • Sql socket write error