Python sqlite insert dict

How to insert dictionary in sqlite3 using python

Note that in order to bind a dictionary, you need to specify the placeholders by name: EDIT: Following up on the discussion from the comments — the dictionary should map placeholder names to their intended values, not list containing them: Question: how to insert dictionary in sqlite3 using python user1 was save to single column and single row EX : ( 1 2 3 4 ]>) save above format in sqlite3 Solution 1: You can’t do that.

How to insert dictionary in sqlite3 using python

 a="1" b="2" c="3" d="4" user1 = ]> con = sqlite3.connect(database=r'data.db') cur = con.cursor() cur.execute("INSERT INTO e_transations (eid,sl,id,datee,ent) VALUES (. )",(a,b,c,d,user1,)) con.commit() 

how to insert dictionary in sqlite3 using python

user1 was save to single column and single row

save above format in sqlite3

You can’t do that. The closest you can do is to serialise the dictionary to a string using json.dumps and then store the resulting string into the column in sqlite3.

import json serialised = json.dumps() . cur.execute("INSERT INTO e_transations (eid, sl, id, datee, ent) VALUES (?, ?, ?, ?, ?)", (a, b, c, d, serialised)) 

You can use the «named» parameter substitution style to obtain SQL statement values from a dictionary. Instead of using ? , use :key where key is the key in the dictionary.

data = with sqlite3.connect(':memory:') as conn: conn.execute("""CREATE TABLE t (foo integer, bar integer, baz integer)""") conn.execute("""INSERT INTO t (foo, bar, baz) VALUES (:foo, :bar, :baz)""", data) 

Python Sqlite3: INSERT INTO table VALUE(dictionary, If you’re trying to use a dict to specify both the column names and the values, you can’t do that, at least not directly.. That’s really inherent in SQL. If you don’t specify the list of column names, you have to specify them in CREATE TABLE order—which you can’t do with a dict, because a dict has no order. If you really wanted to, of course, you could use a collections.OrderedDict, make Code samplecolumns = ‘, ‘.join(values.keys())placeholders = ‘, ‘.join(‘?’ * len(values))sql = ‘INSERT INTO Media (<>) VALUES (<>)’.format(columns, placeholders)values = [int(x) if isinstance(x, bool) else x for x in values.values()]cur.execute(sql, values)Feedback

Python Sqlite3 INSERT INTO table VALUE(dictionary

Python Sqlite3 INSERT INTO table VALUE(dictionary goes here ) — PYTHON [ Glasses to protect eyes while coding : https://amzn.to/3N1ISWI ] Python …

Python — Inserting dictionary into SQLite3

I got a dictionary with 14 keys.

Читайте также:  Документ без названия

First Ive created createTableOfRecordsenter function:

 def createTableOfRecords(self): create_table = '''CREATE TABLE IF NOT EXISTS records(Budget TEXT , Commitment TEXT, Contract_Type TEXT , Customer_Type TEXT, Duration TEXT , Goals TEXT, Pace TEXT , Procedures_and_Regulations TEXT, Resources TEXT , Scope TEXT, Team_Availability TEXT , Team_Distribution TEXT, Team_Size TEXT , Uncertainty TEXT);''' self.cursor.execute(create_table) self.connection.commit() 

and the table with columns created successfully. After that, I tried to insert the data using the insertRecords function:

 global var_dict var_dict = dict(Budget="Fixed", Commitment="Low", Contract_Type="Hybrid", Customer_Type="Market", Duration="Long", Goals="Unclear", Pace="Fast", Procedures_and_Regulations="None", Resources="Standart", Scope="Rigid", Team_Availability="Fully", Team_Distribution="Global", Team_Size="Small", Uncertainty="Predictable") def insertRecords(self): self.cursor.execute('INSERT INTO records (Budget,Commitment,Contract_Type,Customer_Type,Duration,Goals,Pace,' 'Procedures_and_Regulations,Resources,Scope,Team_Availability,' 'Team_Distribution,Team_Size,Uncertainty) ' 'VALUES (:Budget, :Commitment, :Contract_Type, :Customer_Type, :Duration, ' ':Goals, :Pace, :Procedures_and_Regulations, :Resources, :Scope, :Team_Availability, ' ':Team_Distribution, :Team_Size, :Uncertainty);'), var_dict self.connection.commit() 

but I didn’t get any value inserted into the database table. I got this error message:

self.cursor.execute(‘INSERT INTO records (Budget,Commitment,Contract_Type,Customer_Type,Duration,Goals,Pace,’ sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 14, and there are 0 supplied.

Does anyone know what I’ve done wrong? Thanks!

self.cursor.execute( 'insert . ' ), var_dict 

var_dict is not being passed as an argument to execute . It is outside the parenthesis. Instead you are making a two element tuple of the result of execute and var_dict and then throwing it out.

You want to pass var_dict into execute like so.

self.cursor.execute( 'insert . ', var_dict ) 

Here’s a quick illustration of the difference.

>>> var_dict = dict(foo="bar") >>> def test(sql, *optional): . print(f"Got sql '' and args \n") . >>> test('insert. '), var_dict Got sql 'insert. ' and args () (None, ) >>> test('insert. ', var_dict) Got sql 'insert. ' and args (,) 

Python : How to insert a dictionary to a sqlite database?, Insert Values from dictionary into sqlite database – wesinat0r. Apr 7, 2020 at 3:24. Which will insert the elements of the dictionary into the table as you require. Share. Improve this answer. Follow Python — …

Python insert Dict into sqlite3

I have a sqlite3 database where the first column is the id and set as primary key with auto increment. I’m trying to insert the values from my python dictionary as such:

value = soup = bs(contents, 'html.parser') for name in soup.find_all("td", class_="qqp0_c0"): hostname = name.parent.find('td').get_text() drive = name.parent.find('td', class_="qqp0_c1").get_text() used_percent = name.parent.find('td', class_="qqp0_c5").get_text() value['host'].append(hostname) value['drive'].append(drive) value['percent'].append(used_percent) #cur.executemany("INSERT INTO scrap VALUES (?, ?, ?)", hostname, drive, used_percent) cur.execute("INSERT INTO scrap VALUES (?, ?, ?);", value) 

I keep getting errors, my latest error seems to imply it needs an id value:

cur.execute(«INSERT INTO scrap VALUES (?, ?, ?);», value) sqlite3.OperationalError: table scrap has 4 columns but 3 values were supplied

Do I need to supply an id number?

CREATE TABLE scrap ( id INTEGER PRIMARY KEY AUTOINCREMENT, hostname VARCHAR(255), drive VARCHAR(255), perc VARCHAR(255) ); 

If the id column is auto-incrementing you don’t need to supply a value for it, but you do need to «tell» the database that you aren’t inserting it. Note that in order to bind a dictionary, you need to specify the placeholders by name:

cur.execute("INSERT INTO scrap (hostname, drive, perc) VALUES (:host, :drive, :percent);", value) 

EDIT:
Following up on the discussion from the comments — the value dictionary should map placeholder names to their intended values, not list containing them:

soup = bs(contents, 'html.parser') for name in soup.find_all("td", class_="qqp0_c0"): hostname = name.parent.find('td').get_text() drive = name.parent.find('td', class_="qqp0_c1").get_text() used_percent = name.parent.find('td', class_="qqp0_c5").get_text() value = cur.execute("INSERT INTO scrap (hostname, drive, perc) VALUES (:host, :drive, :percent);", value) 

INSERT dictionary sqlite3 (python), 1 Answer. Sorted by: 3. You can use named parameters for all your insert: cur.execute («INSERT INTO GAMES (key1, key2, key3, key4) VALUES (:key1, :key2, :key3, :key4)», merged_dict) This will take parameters by name from a dictionary, but those keys do have to exist. To support keys that may not exist …

Читайте также:  Css aside height 100

Источник

Python Sqlite3: INSERT INTO table VALUE (словарь здесь)

Вопрос здесь: зачем вам это делать? Что вы пытаетесь достичь, и почему вы думаете , держа два совершенно по -другому , указанные вещи (а таблицы SQL и dict набор ключей) в синхронизации является правильный способ сделать это?

Не знаю, чего хотел оригинальный автор, но я нашел вопрос, потому что я генерирую create table из структуры XML-файла, затем, когда я иду, чтобы insert строки, у меня есть attrs и vals в dict и Я знаю, что у БД они будут, но они никогда не бывают статичными.

@eichin Я знаю, что это немного поздно, но . Если вы просто предварительно загружаете базу данных из XML для более статического использования позже, я бы, вероятно, создал сценарий загрузки вместо группы вставок; если вы все время обращаетесь к базе данных с динамическими столбцами, вам следует серьезно подумать о другом типе хранилища, чем реляционная база данных SQL. То, что вы делаете, может быть лучшим в вашем случае, но обычно это не так, поэтому SQL усложняет задачу.

6 ответов

Если вы пытаетесь использовать dict для указания имен столбцов и значений, вы не можете этого сделать, по крайней мере, не напрямую.

Это действительно присуще SQL. Если вы не укажете список имен столбцов, вы должны указать их в порядке CREATE TABLE , который вы не можете сделать с помощью dict , потому что dict не имеет порядка. Если вы действительно хотели, конечно, вы могли бы использовать collections.OrderedDict , убедитесь, что он в правильном порядке, а затем просто пройдите values.values() . Но в этот момент, почему бы просто не иметь list (или tuple ) в первую очередь? Если вы абсолютно уверены, что у вас есть все значения в правильном порядке, и вы хотите ссылаться на них по порядку, а не по имени, то у вас есть list , а не dict .

Читайте также:  Python get project path

И нет способа привязать имена столбцов (или имена таблиц и т.д.) в SQL, просто значения.

Вы можете, конечно, генерировать инструкцию SQL динамически. Например:

columns = ', '.join(values.keys()) placeholders = ', '.join('?' * len(values)) sql = 'INSERT INTO Media (<>) VALUES (<>)'.format(columns, placeholders) cur.execute(sql, values.values()) 

Однако это почти всегда плохая идея. Это действительно не намного лучше, чем генерация и exec динамический код Python. И вы только что потеряли все преимущества использования заполнителей в первую очередь — прежде всего защиту от атак SQL-инъекций, а также менее важные вещи, такие как более быстрая компиляция, лучшее кэширование и т.д. Внутри механизма БД.

Вероятно, лучше отступить и посмотреть на эту проблему с более высокого уровня. Например, может быть, вам действительно не нужен статический список свойств, а таблица имен MediaProperties ? Или, альтернативно, возможно, вам нужно какое-то хранилище на основе документов (будь то мощная система nosql или просто куча объектов JSON или YAML, хранящихся в shelve )?

Альтернатива с использованием названных заполнителей:

columns = ', '.join(my_dict.keys()) placeholders = ':'+', :'.join(my_dict.keys()) query = 'INSERT INTO my_table (%s) VALUES (%s)' % (columns, placeholders) print query cur.execute(query, my_dict) con.commit() 

@oche: «Не проверено, но код кажется неправильным. Вставка ключей в таблицу дважды (для заполнителя) выглядит небольшой ошибкой». Нет, вызов execute заменяет каждый именованный заполнитель путем поиска его имени в качестве ключа в my_dict . Следовательно, это должны быть keys , а не values . Представьте, что my_dict = <'spam': 'eggs'>. Если вы поместите заполнитель :eggs в оператор SQL, это не будет найдено в my_dict ; вам нужно :spam .

Заполнители автоматически выполняют корректное экранирование, тогда как, если вы строите запрос самостоятельно, вам необходимо кодировать специальную логику экранирования.

Заполнители не делают правильный выход, даже автоматически. Они просто не экранируют, потому что они не вставляются текстовым способом в оператор SQL.

@JürgenA.ErhardJürgenA.Erhard Технически, под прикрытием, некоторые библиотеки SQL действительно обрабатывают заполнители, просто экранируя их в строку… Но пользователи не должны это знать; каждая библиотека SQL лучше всего работает с заполнителями для своего бэкэнда и делает это правильно, поэтому +1 к вашему комментарию.

В нижней части ответа нет пользовательских заполнителей, где указано, что это так. Проверьте docs.python.org/2/library/sqlite3.html

Источник

Оцените статью