You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python数据库插入报错:TypeError及参数缺失问题求助

Fixing Your SQLite Insert Errors in Tkinter

Let's break down and fix your issues step by step:

1. First Error: TypeError: 'str' object is not callable

This bug comes from a missing comma in your execute() call. When you wrote:

d.execute('INSERT INTO usersname(name, email) values (?,?)' (newname,newemail))

Python interprets the SQL string followed by (newname,newemail) as an attempt to call the string like a function—which doesn't make sense, hence the error.

Fix: Add a comma between the query string and parameter tuple:

d.execute('INSERT INTO usersname(name, email) values (?,?)', (newname,newemail))

2. Second Error: TypeError: insert_new_user() missing 2 required positional arguments

You added parameters to insert_new_user() but didn't pass values when calling it (likely from a Tkinter button's command). But since your function already pulls values directly from the entry widgets, you don't need those parameters at all.

Fix: Revert the function to its original signature (no parameters) and keep the corrected execute() line:

def insert_new_user():
    newname = str(entry_new_name.get())
    newemail = str(entry_new_email.get())
    # Fixed comma here
    d.execute('INSERT INTO usersname(name, email) values (?,?)', (newname,newemail))
    conn.commit()
    # Optional: Clear entry fields after successful insert
    entry_new_name.delete(0, END)
    entry_new_email.delete(0, END)

Bonus Optimization: Cut Redundant Cursors

You created two cursor objects (c and d) but only need one for all database operations. This cleans up your code:

conn = sqlite3.connect('data.db')
c = conn.cursor()  # Single cursor for all queries

def create_table():
    c.execute('CREATE TABLE IF NOT EXISTS usersdata(name TEXT,reason TEXT,startDate TEXT,endDate TEXT)')
    c.execute('CREATE TABLE IF NOT EXISTS usersname(name TEXT,email TEXT)')

def insert_new_user():
    newname = str(entry_new_name.get())
    newemail = str(entry_new_email.get())
    c.execute('INSERT INTO usersname(name, email) values (?,?)', (newname,newemail))
    conn.commit()

Full Corrected Code

Here's your complete code with all fixes applied (including a missing submit button trigger):

import sqlite3
from tkinter import Tk, Label, Entry, StringVar, Frame, Button

# Initialize database connection
conn = sqlite3.connect('data.db')
c = conn.cursor()

def create_table():
    c.execute('CREATE TABLE IF NOT EXISTS usersdata(name TEXT,reason TEXT,startDate TEXT,endDate TEXT)')
    c.execute('CREATE TABLE IF NOT EXISTS usersname(name TEXT,email TEXT)')

def insert_new_user():
    newname = str(entry_new_name.get())
    newemail = str(entry_new_email.get())
    # Fixed comma between query and parameters
    c.execute('INSERT INTO usersname(name, email) values (?,?)', (newname,newemail))
    conn.commit()
    # Clear entries after successful insert
    entry_new_name.delete(0, 'end')
    entry_new_email.delete(0, 'end')

# Create tables on startup
create_table()

# App setup (assuming tab4 is a frame in your Tkinter app)
root = Tk()
tab4 = Frame(root)
tab4.pack(padx=10, pady=10)

# Name entry
label_new_name = Label(tab4, text="New Full Name", padx=5, pady=5)
label_new_name.grid(column=0, row=1)
new_name_raw_entry = StringVar()
entry_new_name = Entry(tab4, textvariable=new_name_raw_entry, width=60)
entry_new_name.grid(row=1, column=1)

# Email entry
label_new_email = Label(tab4, text="New Email", padx=5, pady=5)
label_new_email.grid(column=0, row=2)
new_email_raw_entry = StringVar()
entry_new_email = Entry(tab4, textvariable=new_email_raw_entry, width=60)
entry_new_email.grid(row=2, column=1)

# Submit button to trigger insert
submit_btn = Button(tab4, text="Add User", command=insert_new_user, padx=10, pady=5)
submit_btn.grid(column=1, row=3, pady=10)

root.mainloop()

# Close database connection on app exit
conn.close()

Key Takeaways

  • Always separate your SQL query and parameters with a comma in execute() to avoid syntax/type errors.
  • If your function can access Tkinter widgets directly (same scope), you don't need to pass widget values as parameters.
  • Stick to one cursor for all database operations unless you have a specific reason to use multiple.

内容的提问来源于stack exchange,提问作者RobE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:06:28