【问题标题】:sqlite3.OperationalError: table AMOUNTS has no column named sql_datesqlite3.OperationalError:表 AMOUNTS 没有名为 sql_date 的列
【发布时间】:2020-05-31 23:13:51
【问题描述】:

我正在使用 python、tkinter 和 sqlite 创建费用跟踪器。我希望用户将他们的费用输入到使用下拉菜单提供的类别中。但是,当我在任何一个类别中输入金额时,都会收到错误消息。我不确定如何解决此错误(我是初学者),请告知。以下是确切的错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 1883, in __call__
    return self.func(*args)
  File "/Users/hetparikh/PycharmProjects/BudCalculator/test.py", line 38, in SaveExpenseType
    c.execute('INSERT INTO AMOUNTS (sql_date, sql_Expense, sql_clicked) VALUES (?, ?, ?)',
sqlite3.OperationalError: table AMOUNTS has no column named sql_date

以下是我的代码:

    from tkinter import *
    import sqlite3 as sq
    import datetime

    # Connect to SQLite
    con = sq.connect('budCalc.db')

    root = Tk()

    # Options in dropdown menu
    options = [
        'Food',
        'Transportation',
        'Entertainment',
        'Misc'
    ]

    # Drop down menu
    clicked = StringVar()
    clicked.set('Expense')
    drop = OptionMenu(root, clicked, *options,)
    drop.grid(row=0, column=2, padx=20)

    Expense = Entry(root, width=30)
    Expense.grid(row=0, column=1, padx=20)

    delete_box = Entry(root, width=20)
    delete_box.grid(row=10, column=2)

    # Function for inserting input into SQLite


    def SaveExpenseType():
        c = con.cursor()
        c.execute('CREATE TABLE IF NOT EXISTS AMOUNTS (sql_date VARCHAR(20), sql_Expense VARCHAR(20), sql_clicked VARCHAR(20) NOT NULL)')
        today = str(datetime.date.today())
        today = today[8:] + '-' + today[5:7] + '-' + today[:4]
        c.execute('INSERT INTO AMOUNTS (sql_date, sql_Expense, sql_clicked) VALUES (?, ?, ?)',
                  (today, float(Expense.get()), clicked.get()))
        con.commit()

    # CREATE FUNCTION TO DELETE A RECORD
    def delete():
        conn = sq.connect('budCalc.db')
        c = conn.cursor()

        # DELETE A RECORD
        c.execute("DELETE from amounts WHERE oid = " + delete_box.get())

        conn.commit()
        conn.close()

    def query():
        conn = sq.connect('budCalc.db')
        c = conn.cursor()

        c.execute("SELECT *, oid FROM amounts")
        records = c.fetchall()

        print_records = ''
        for record in records:
            print_records += "Date: " + str(record[0]) + ", Amount Spent: $" + str(record[1]) + ", Category: " + str(record[2]) + "    " + str(record[3]) + "\n" + "\n"

        query_label = Label(root, text=print_records)
        query_label.grid(row=8, column=0, columnspan=2)


        conn.commit()
        conn.close()


    # CREATE A DELETE BUTTON
    delete_btn = Button(root, text="Delete Record", command=delete)
    delete_btn.grid(row=10, column=0, columnspan=2, pady=10, padx=10, ipadx=137)

    # Query Button
    query_btn = Button(root, text="Show Records", command=query)
    query_btn.grid(row=7, column=0, columnspan=2, pady=10, padx=10, ipadx=137)

    # Button for user to activate the function inserting data into SQLite
    carB = Button(root, text="Enter", command=SaveExpenseType)
    carB.grid(row=1, column=2)

    root.mainloop()

【问题讨论】:

  • 您之前是否可以使用不同的架构初始化表 AMOUNTS?因为CREATE TABLE IF NOT EXISTS 不会检查以确保架构匹配。如果是这种情况,您只需删除 .db 文件或手动删除表并让脚本重新创建表。
  • 情况并非如此,因为我刚刚手动删除了 budCalc.db 文件,但仍然收到相同的错误。 @notacorn
  • 你可以试试打印c.execute("SELECT sql FROM sqlite_master WHERE name = 'AMOUNTS';")
  • 如果对象不详,只需用list()包装即可
  • 你想让我在哪里插入那行代码@notacorn

标签: python database sqlite tkinter


【解决方案1】:

您应该像这样进行插入。这就是我通常填充我生成的 sqlite3 表的方式:

def populate_tbl_file_marker_linenums(p_fml_tbl, p_fml_datafile):
    """ Read csv and load data into TBL_FILE_MARKER_LINENUMS table ...

    Args:
        p_fml_tbl (TEXT) target table name
        p_fml_datafile (TEXT) name of csv file to load into table

    Returns:
        retval (TEXT) - Status of method, e.g., 'SUCCESS'
    """
    retval = ''
    mode = 'r'

    try:
        conn = sqlite3.connect(sqlite_file)
        c = conn.cursor()
        csv_dataset = open(p_fml_datafile, mode)
        csv_reader = csv.reader(csv_dataset)

        c.executemany('INSERT INTO ' + p_fml_tbl + ' (FILENAME, LINENO, PREFIX_DELIM, MARKER, SUFFIX_DELIM) VALUES (?, ?, ?, ?, ?)', csv_reader)

        conn.commit()
        conn.close()
        retval = 'SUCCESS'

    except Error as e:
        print(e)

    return retval

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 2022-01-05
    • 2020-02-26
    • 1970-01-01
    • 2015-07-30
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多