Запросите базу данных SQLite3 с помощью SELECT и параметров, таких как INSERT - PullRequest
0 голосов
/ 11 октября 2019

У меня есть база данных SQLite3 с 1 таблицей и множеством столбцов. Столбцы представляют собой смесь REAL, INTEGERS и TEXT. Некоторые из текстовых записей содержат datetime.

Я хотел бы вставить строки в таблицу без добавления дубликатов. В таблице больше столбцов, чем я вставляю данные. Чтобы сделать это, я хотел бы сначала запросить таблицу для любых строк, которые содержат все данные, которые я хотел бы вставить. Если таблица не содержит строки с соответствующим набором параметров, вставьте строку.

Если таблица имеет 2 строки в настоящее время и выглядит следующим образом:

a, b, c, d 
2019-09-20 00:00:00, 1.1, 'DOG', nan 
2019-10-20 10:00:00, 2.2, 'CAT', -2000

Вставка строкипрост:

insert_vals = [datetime.datetime(2019, 9, 27, 0, 0), 123.4, 'DOG']
column_names = ['a', 'b', 'c']
strDBInsert = "INSERT INTO table_name ({}) VALUES ({})".format(column_names, strQuestions)
conn = sqlite3.connect('db_name.db')
c= conn.cursor()
c.execute(strDBquery, insert_vals)
conn.commit()

Однако возможно ли выполнить запрос к базе данных аналогичным образом, как показано ниже?

strDBquery = "SELECT * FROM table_name WHERE {} LIKE {}".format(column_names, insert_vals)
c.execute(strDBquery, insert_vals)
queryData = c.fetchall()

Я получаю ошибку

 sqlite3.OperationalError: near ",": syntax error

Я ожидаю вывод:

print(queryData)
Output: [datetime.datetime(2019, 9, 27, 0, 0), 123.4, 'DOG', nan]

Другой вариант, который мне понадобится:

c.execute("SELECT * FROM table_name WHERE a == datetime.datetime(2019, 9, 27, 0, 0), AND b == 123.4 AND c == DOG")

Для большего контекста я использую python с пандами для чтенияв CSV с биржевых транзакций, и я хочу обновить базу данных с новыми транзакциями. Затем я хочу добавить другую информацию в эту таблицу транзакций и использовать другую таблицу в базе данных для хранения информации о портфеле. Может быть, есть гораздо более простой способ сделать большинство из них без запроса, а затем вставить опцию.

Некоторые другие похожие вопросы:

SQLite3 запрашивает базу данных с помощью «?»заполнители

SQLite3 LIKE-запрос с кодировкой UTF-8

1 Ответ

0 голосов
/ 12 октября 2019

Сначала перейдите к документации, когда возникнут вопросы о синтаксисе и параметрах. Как правило, ответы SO не предназначены для полных учебных пособий, но вопрос и примеры содержат ряд синтаксических ошибок, поэтому в следующих параграфах объясняются некоторые базовые концепции SQL SQL. Чтобы продолжить писать такой код и избежать такого количества проблем, нужно изучить синтаксис SQL.

Строковые значения должны быть в кавычках , как и в любом другом языке программирования. Нечто подобное c == DOG будет интерпретироваться как DOG объект базы данных или ключевое слово, а не значение.

Оператор LIKE предназначен для сопоставления строк с шаблоном. Это не обязательно хорошо для сравнения равенства общих ценностей. Это также не автоматический оператор для сравнения значений любого типа данных. Он поддерживает отдельные параметры, а не список параметров. Если вам необходимо сопоставить несколько строк, необходимо включить несколько операторов LIKE, по одному для каждого столбца и / или сравнения.

Нет фактических типов данных даты или времени для sqlite . Есть функции для работы с датами, но они предназначены для генерации значений даты в виде строковых и / или числовых юлианских представлений. Ожидаемые строковые форматы - это форматы ISO-8601, например YYYY-MM-DD HH:MM:SS.SSS. Есть функция datetime(), но она не принимает параметры, как угадано в вопросе. Также не ссылается на функции языка хоста из SQL, поэтому что-то вроде datetime.datetime() не работает.

Остерегайтесь случайных запятых.


общая схема в этом предположении будет наиболее близка к хорошему решению:

c.execute ("SELECT * FROM table_name WHERE a == datetime.datetime (2019, 9, 27, 0, 0),AND b == 123.4 AND c == DOG ")

Исправленная версия этого утверждения будет выглядеть следующим образом. Сравнение даты и времени будет выполнено как сравнение строк со столбцом a, поэтому предполагается, что столбцы a ранее были сохранены с использованием тех же форматов. Если это не так, любые значения даты и времени нужно будет манипулировать и сравнивать по-разному.

c.execute("SELECT * FROM table_name WHERE a == datetime('2019-09-27 00:00:00') AND b == 123.4 AND c == 'DOG'")

Оператор, безусловно, может быть сгенерирован из списков, таких как column_names и insert_vals, но поскольку типы данных различаются, это не будет простой, равномерный разделитель, как пытались другие догадки. Вам понадобится некоторая форма условия типа данных для подготовки выражений сравнения для каждого столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...