【问题标题】:python sqlite3 record is not inserting into the database with a placeholder functionpython sqlite3记录未使用占位符函数插入数据库
【发布时间】:2020-04-30 18:58:53
【问题描述】:

此代码没有将我的列表(self.list2)插入到数据库“main.db”中。我已经阅读了以下帖子,他们似乎都使用了使用 join() 根据列表长度创建占位符的想法。

Dynamically creating a placeholder to insert many column values for a row in SQLite table

Inserting to sqlite dynamically with 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)''')
    

也许我错过了一个小细节,或者我不知道 return 语句/函数是如何工作的。
请帮我解决这个问题。感谢您提供任何帮助。

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()

【问题讨论】:

  • 在你place_holder函数你在你执行之前返回你注意到了吗? return (f"{', '.join('?' * len(input))}")。我认为这一行会走到函数的末尾?
  • @zxy,嗨,你的意思是在“self.conn.关闭()”?我试了,还是插不进去。谢谢。

标签: python-3.x sqlite row sql-insert


【解决方案1】:

您试图在place_holder 方法中的return 之后插入数据库,这是不可能的,因为函数在返回后退出。同样在您的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()

【讨论】:

  • 嗨@zxy 感谢您抽出时间帮助我。我肯定很困惑,因为我不知道我必须创建一个变量,以及把它放在哪里。现在对我来说更清楚了。最后一个问题,{_placeholder},为什么它是“{ }”,而不是“()”?是因为我的 f 字符串返回语句吗?再次感谢。
  • place_holder 方法将 (?, ?, .....) 作为字符串返回,所以对于 f 字符串是 {}
猜你喜欢
  • 1970-01-01
  • 2021-08-05
  • 2017-02-10
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多