我在为自己构建一个随机项目时遇到了一个问题。我正试图把条目记录到 mysql
用户键入的数据库。我正在把它们存到字典里。错误消息是
while self.nextset():
AttributeError: 'str' object has no attribute 'nextset'
我在google上搜索过这个问题,但我只找到了类似的问题,但没有发现相同的错误。
我的表格标题 mysql
db匹配字典键。我确实意识到我的选择(2)有问题,但我的错误和我现在正在排除的是,当我选择选项(1)。
import mysql
import pymysql
from datetime import date, datetime, timedelta
cursor = pymysql.cursors.Cursor
# Function for adding a new entry
def new_entry(name, date, task, time, notes):
# Build dictionary with new entry information
myDict = {
'Employee': name, # Name of employee
'Date': date, # Date of worked task
'Task': task, # Title of Task
'Time': time, # Time spent on task
'Notes': notes # Notes on the task
}
table = ('timesheet')
placeholders = ', '.join(['%s'] * len(myDict))
columns = ', '.join(myDict.keys())
sql = "INSERT INTO %s ( %s ) VALUES ( %s )" % (table, columns,
placeholders)
pymysql.cursors.Cursor.execute(sql, myDict)
# list all entries for a particular employee
def previous_entries(emp_name):
pymysql.cursors.Cursor.execute(
"SELECT * from user_data WHERE Name = %s", (emp_name,))
# list all entries that match a date or search term
# def search_entries():
# return null
# Print a report of this information to the screen, including the date, title
# of task, time spent, employee, and general notes.
if __name__ == '__main__':
#cnx = mysql.connect(user='root', database='me10_mig')
cnx = pymysql.connect(user='root', password='password',
database='me10_mig')
print("Please enter (1), (2), or (3)")
begin = input("Would you like to (1) enter a new entry or (2) display
all
previous entries or (3) display entries that match a date or search
term? ")
if begin == '1':
name = input("Your Name: ")
date = input("Date of Time Worked: ")
task = input("Title of Task: ")
time = input("Time Spent on Task: ")
notes = input("Notes on Time Worked: ")
new_entry(name, date, task, time, notes)
if begin == '2':
name = input("What is the employee name: ")
previous_entries(name)
#if begin == '3':
我得到的错误是:
Traceback (most recent call last):
File "C:/Users/a089673/Desktop/Python/TeamTreeHouse/Part 4/timesheet.py", line 61, in <module>
new_entry(name, date, task, time, notes)
File "C:/Users/a089673/Desktop/Python/TeamTreeHouse/Part 4/timesheet.py", line 27, in new_entry
pymysql.cursors.Cursor.execute(sql, myDict)
File "C:\Users\a089673\AppData\Roaming\Python\Python36\site packages\pymysql\cursors.py", line 165, in execute
while self.nextset():
AttributeError: 'str' object has no attribute 'nextset'
Process finished with exit code 1
有什么建议吗?
1条答案
按热度按时间mnemlml81#
我怀疑你可能是因为
dict
坚持论点.execute()
,但在sql语句中不使用命名字符串模式。医生建议使用
%s
传递列表或元组时,而不是使用%(name)s
当经过一个dict
.我建议您尝试以下代码:
这还将确保列名和占位符的顺序相同。您的原始代码没有考虑到这一点(请记住,迭代dicts multimple time并不保证每次都给出相同的顺序)。
我完全忽略了与数据库建立连接的部分。您需要将该连接作为参数传递给
new_entry()
使用它。试试这个: