我写了一种将单个雇员添加到数据库的方法:
def insert_employee(emp):
conn = sqlite3.connect('employees.db')
curs = conn.cursor()
with conn:
curs.execute("INSERT INTO employees VALUES (:first, :last, :pay)",
{'first': emp.first, 'last': emp.last, 'pay': emp.pay})
conn.commit()
conn.close()
这有效:
emp1 = Employee("Josh", "Brandon", "2000")
DataBase.insert_employee(emp1)
然后,我将其展开以添加员工列表:
def insert_employees(emp_list):
conn = sqlite3.connect('employees.db')
curs = conn.cursor()
with conn:
for i in range(2):
curs.execute("INSERT INTO employees VALUES (:first, :last, :pay)",
{'first': emp_list[i].first, 'last': emp_list[i].last, 'pay': emp_list[i].pay})
conn.commit()
conn.close()
这不起作用:
emps = [("Brenda", "Johnson", "4000"), ("Reza", "Amir", "5000")]
DataBase.insert_employees(emps)
我得到一个AttributeError
,上面写着'tuple' object has no attribute 'first'
。
我在想什么或做错了什么?
答案 0 :(得分:1)
这将创建一个类的实例,您使用了它的getter函数,例如first,last等。
emp1 = Employee("Josh", "Brandon", "2000")
但这只是一个数组
emps = [("Brenda", "Johnson", "4000"), ("Reza", "Amir", "5000")]
根据获取数据的方式和要对数据进行多少突变,您可以直接访问密钥
emp_list[i][0]
而不是第一个
emp_list[i][1]
而不是最后一个
答案 1 :(得分:1)
您只有一个元组列表。看来您想要拥有一个员工对象列表,以进行更改
emps = [("Brenda", "Johnson", "4000"), ("Reza", "Amir", "5000")]
到
emps = [Employee("Brenda", "Johnson", "4000"), Employee("Reza", "Amir", "5000")]
答案 2 :(得分:1)
emp_list[i]
返回一个元组,它自然不包含您要查找的任何属性。
如果要通过属性获取值,可以查看namedtuple
employee = namedtuple('Employee', ['first', 'last', 'pay'])
emps = [employee('John', 'Wick', '1000000'), ...)
insert_emploees(emps)
但是更简单的解决方案是更好地处理元组:
curs.execute("INSERT INTO employees VALUES (:first, :last, :pay)",
dict(zip(['first', 'last', 'pay'], *i)))