python sqlite3 запись не вставляется в базу данных с функцией заполнителя - PullRequest
0 голосов
/ 14 января 2020

этот код не вставляет мой список (self.list2) в базу данных 'main.db'. Я уже прочитал следующие посты, и все они, похоже, используют идею использования join () для создания # заполнителей на основе длины списка.

Динамическое создание заполнителя для вставки множества значений столбца для строки в таблице SQLite

Динамическая вставка в sqlite с помощью Python 3

  1. код работает без ошибок.
  2. Я проверил код, напечатав

    return (f"{', '.join('?' * len(input))}")
    

    , и он печатает «?,?,?,?», Так что я знаю, что функция работает.

  3. база данных создана правильно со следующим кодом:

    self.cursor.execute('''CREATE TABLE IF NOT EXISTS main
                        (T_num text  Primary Key NOT NULL,
                        Name text NOT NULL,
                        Item1 text,
                        Item2 text,
                        Item3 text)''')
    

Возможно, я пропустил небольшую деталь, или я не знаю, как вернуть оператор / функцию работает.
Пожалуйста, помогите мне решить эту проблему. Спасибо за любую помощь.

import tkinter as tk
import sqlite3


class Model():
    def __init__(self):

        self.list1 = [('Table #', '6'), ('Name', 'Jenn'), ('Beef 
               Tacos', '6'), ("Fish Tacos", "6")]
        self.list2 = list(map(": ".join, self.list1))

        self.conn = sqlite3.connect("4th.db")
        self.cursor=self.conn.cursor()


        self.place_holder(self.list2)

    def place_holder(self, input):
        return (f"{', '.join('?' * len(input))}")

        self.cursor.execute("INSERT INTO main VALUES (place_holder(input))", self.list2)

        self.conn.commit()
        self.conn.close()

    if __name__ == "__main__":
        c = Model()

1 Ответ

1 голос
/ 17 января 2020

Вы пытались вставить в БД после return в вашем методе place_holder, что невозможно, поскольку функция завершается после возврата. Также в вашем sql укажите, в какой столбец вы хотите вставить. вот так

self.cursor.execute(f"INSERT INTO main (T_num, Name, Item1, Item2) VALUES {_placeholder}", self.list2)

Ваша программа закончена, надеюсь, она вам поможет.

import tkinter as tk
import sqlite3


class Model():
    def __init__(self):

        self.list1 = [('Table #', '6'), ('Name', 'Jenn'), ('Beef Tacos', '6'), ("Fish Tacos", "6")]
        self.list2 = list(map(": ".join, self.list1))

        self.conn = sqlite3.connect("4th.db")
        self.cursor = self.conn.cursor()

        _placeholder = self.place_holder(self.list2)
        # specify here in which column you want to insert the data
        self.cursor.execute(f"INSERT INTO main (T_num, Name, Item1, Item2) VALUES {_placeholder}", self.list2)

        self.conn.commit()
        self.conn.close()

    def place_holder(self, input_list):
        '''Returns the place holder (?, ?, .....) as string'''
        return f"({', '.join('?' * len(input_list))})"


if __name__ == "__main__":
    c = Model()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...