Python数据库插入报错:TypeError及参数缺失问题求助
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

