将多个值插入数据库

时间:2020-10-02 12:38:06

标签: python sql

我写了一种将单个雇员添加到数据库的方法:

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'

我在想什么或做错了什么?

3 个答案:

答案 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)))