尝试使用 pyodbc 和 tkinter 将记录插入 SQL 服务器
Trying to insert a record into SQL Server with pyodbc and tkinter
我正在尝试编写一个应用程序,以便在添加新设备时轻松更新数据库。到目前为止,我能够连接到数据库并创建了一个 GUI 来显示一些东西。
现在我无法尝试从用户创建的条目中插入新记录。基本上,用户输入 3 个值:EquipmentName、HostName 和 ValidationName,这将在数据库中创建一条新记录。
我收到一个错误:
line 32, in submit
'ValidationName': ValidationName.get() pyodbc.ProgrammingError: ('The SQL contains 0 parameter markers, but 1 parameters were supplied', 'HY000')
我已经尝试 google 一切,但在
中没有运气
抱歉,如果这没有意义,这是我第一次尝试使用 python 进行编码。
from tkinter import *
import pyodbc
#Create application and size
root = Tk()
root.title('Application')
root.geometry("400x400")
# Connect to SQL Server database
conn = pyodbc.connect('Driver={SQL Server};'
'Server=USGRE-PC0XLKJM\SQLEXPRESS;'
'Database=LAB;'
'Trusted_Connection=yes;')
#Create cursor
cursor = conn.cursor()
cursor.execute('SELECT * FROM LAB.dbo.LabSystem')
#Create submit function for database
def submit():
# Connect to SQL Server database
conn = pyodbc.connect('Driver={SQL Server};'
'Server=USGRE-PC0XLKJM\SQLEXPRESS;'
'Database=LAB;'
'Trusted_Connection=yes;')
# Create cursor
cursor = conn.cursor()
# Insert into table
cursor.execute("INSERT INTO LAB.dbo.LabSystem VALUES (:EquipmentName, :HostName, :ValidationName)",
{
'EquipmentName': EquipmentName.get(),
'HostName': HostName.get(),
'ValidationName': ValidationName.get()
})
# Commit changes
conn.commit()
# Close connection
conn.close()
# Clear the text boxes
EquipmentName.delete(0, END)
HostName.delete(0, END)
ValidationName.delete(0, END)
# Create query function
def query():
# Connect to SQl Server DB
conn = pyodbc.connect('Driver={SQL Server};'
'Server=USGRE-PC0XLKJM\SQLEXPRESS;'
'Database=LAB;'
'Trusted_Connection=yes;')
# Create cursor
cursor = conn.cursor()
# Query the database
cursor.execute("SELECT *,SystemID FROM LAB.dbo.LabSystem")
records = cursor.fetchall()
#print(records)
#Loop through results
print_records = ''
for record in records:
print_records += str(record[0]) + " " +str(record[2]) + " " "\n"
query_label = Label(root, text=print_records)
query_label.grid(row=3, column=0, columnspan=2)
# Commit changes
conn.commit()
# Close connection
conn.close()
# Create text boxes
EquipmentName = Entry(root, width=30)
EquipmentName.grid(row=0, column=1, padx=20)
HostName = Entry(root, width=30)
HostName.grid(row=1, column=1)
ValidationName = Entry(root, width=30)
ValidationName.grid(row=2, column=1)
# Create labels for text boxes
EquipmentName_label = Label(root, text="Equipment Name")
EquipmentName_label.grid(row=0, column=0)
HostName_label = Label(root, text="Host Name")
HostName_label.grid(row=1, column=0)
ValidationName_label = Label(root, text="Validation Name")
ValidationName_label.grid(row=2, column=0)
# Create submit button to add entries
submit_btn = Button(root, text="Add record", command=submit)
submit_btn.grid(row=6, column=0, columnspan=2, pady=10, padx=10)
# Create a 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)
#Commit changes
conn.commit()
# Close connection
conn.close()
root.mainloop()
就关注而言,pyodbc does not support named parameters。
您可以尝试使用位置参数而不是命名参数:
cursor.execute(
"INSERT INTO LAB.dbo.LabSystem VALUES (?, ?, ?)",
EquipmentName.get(),
HostName.get(),
ValidationName.get()
)
你太接近了,你需要解析 dict 值 - 创建一个函数来将 dict 解析为插入语句
def values_statement(lst):
if lst:
_ = [tuple([str(l).replace("'", "") for l in ls.values()])
for ls in lst]
return ','.join([str(i) for i in _])
我假设 final_dict 现在只有一行?将其设为字典列表会更有效率。那可行吗?
final_dict = [{
'EquipmentName': EquipmentName.get(),
'HostName': HostName.get(),
'ValidationName': ValidationName.get()
}]
cursor.execute("INSERT INTO LAB.dbo.LabSystem VALUES (EquipmentName, HostName, ValidationName)".format(values_statement(final_dict))
)
我正在尝试编写一个应用程序,以便在添加新设备时轻松更新数据库。到目前为止,我能够连接到数据库并创建了一个 GUI 来显示一些东西。
现在我无法尝试从用户创建的条目中插入新记录。基本上,用户输入 3 个值:EquipmentName、HostName 和 ValidationName,这将在数据库中创建一条新记录。
我收到一个错误:
line 32, in submit
'ValidationName': ValidationName.get() pyodbc.ProgrammingError: ('The SQL contains 0 parameter markers, but 1 parameters were supplied', 'HY000')
我已经尝试 google 一切,但在
中没有运气抱歉,如果这没有意义,这是我第一次尝试使用 python 进行编码。
from tkinter import *
import pyodbc
#Create application and size
root = Tk()
root.title('Application')
root.geometry("400x400")
# Connect to SQL Server database
conn = pyodbc.connect('Driver={SQL Server};'
'Server=USGRE-PC0XLKJM\SQLEXPRESS;'
'Database=LAB;'
'Trusted_Connection=yes;')
#Create cursor
cursor = conn.cursor()
cursor.execute('SELECT * FROM LAB.dbo.LabSystem')
#Create submit function for database
def submit():
# Connect to SQL Server database
conn = pyodbc.connect('Driver={SQL Server};'
'Server=USGRE-PC0XLKJM\SQLEXPRESS;'
'Database=LAB;'
'Trusted_Connection=yes;')
# Create cursor
cursor = conn.cursor()
# Insert into table
cursor.execute("INSERT INTO LAB.dbo.LabSystem VALUES (:EquipmentName, :HostName, :ValidationName)",
{
'EquipmentName': EquipmentName.get(),
'HostName': HostName.get(),
'ValidationName': ValidationName.get()
})
# Commit changes
conn.commit()
# Close connection
conn.close()
# Clear the text boxes
EquipmentName.delete(0, END)
HostName.delete(0, END)
ValidationName.delete(0, END)
# Create query function
def query():
# Connect to SQl Server DB
conn = pyodbc.connect('Driver={SQL Server};'
'Server=USGRE-PC0XLKJM\SQLEXPRESS;'
'Database=LAB;'
'Trusted_Connection=yes;')
# Create cursor
cursor = conn.cursor()
# Query the database
cursor.execute("SELECT *,SystemID FROM LAB.dbo.LabSystem")
records = cursor.fetchall()
#print(records)
#Loop through results
print_records = ''
for record in records:
print_records += str(record[0]) + " " +str(record[2]) + " " "\n"
query_label = Label(root, text=print_records)
query_label.grid(row=3, column=0, columnspan=2)
# Commit changes
conn.commit()
# Close connection
conn.close()
# Create text boxes
EquipmentName = Entry(root, width=30)
EquipmentName.grid(row=0, column=1, padx=20)
HostName = Entry(root, width=30)
HostName.grid(row=1, column=1)
ValidationName = Entry(root, width=30)
ValidationName.grid(row=2, column=1)
# Create labels for text boxes
EquipmentName_label = Label(root, text="Equipment Name")
EquipmentName_label.grid(row=0, column=0)
HostName_label = Label(root, text="Host Name")
HostName_label.grid(row=1, column=0)
ValidationName_label = Label(root, text="Validation Name")
ValidationName_label.grid(row=2, column=0)
# Create submit button to add entries
submit_btn = Button(root, text="Add record", command=submit)
submit_btn.grid(row=6, column=0, columnspan=2, pady=10, padx=10)
# Create a 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)
#Commit changes
conn.commit()
# Close connection
conn.close()
root.mainloop()
就关注而言,pyodbc does not support named parameters。
您可以尝试使用位置参数而不是命名参数:
cursor.execute(
"INSERT INTO LAB.dbo.LabSystem VALUES (?, ?, ?)",
EquipmentName.get(),
HostName.get(),
ValidationName.get()
)
你太接近了,你需要解析 dict 值 - 创建一个函数来将 dict 解析为插入语句
def values_statement(lst):
if lst:
_ = [tuple([str(l).replace("'", "") for l in ls.values()])
for ls in lst]
return ','.join([str(i) for i in _])
我假设 final_dict 现在只有一行?将其设为字典列表会更有效率。那可行吗?
final_dict = [{
'EquipmentName': EquipmentName.get(),
'HostName': HostName.get(),
'ValidationName': ValidationName.get()
}]
cursor.execute("INSERT INTO LAB.dbo.LabSystem VALUES (EquipmentName, HostName, ValidationName)".format(values_statement(final_dict))
)