有没有一种方法可以创建变量来存储数据库中列的值,而无需在pymysql中多次执行相同的查询?

时间:2019-06-05 10:00:49

标签: python mysql pymysql

我正在用python创建一个简单的程序,我想创建存储来自我的学生数据库每一列的值的变量。我发现每次我想分配一个新变量时都需要执行一个查询。有没有一种方法可以创建这些变量而无需多次执行相同的查询?

import pymysql 
conn = pymysql.connect(host='localhost',
cursorclass=pymysql.cursors.DictCursor,
user='root',password='***')

conn.autocommit(True)
cur = conn.cursor()
students = [[1,'Hubert',4.0],
            [2,'Macia',3.2],
            [3,'Pontas',3.5],
            [4,'Bartek',4.0],
            [5,'Dundersztyc',2.1],
            [6,'Diabel',2.7],
            [7,'Kondzias',3.1],
            [8,'Krapol',3.4],
            [9,'Any',2.8],
            [10,'Jacenty',2.5]]
try:
    use = 'USE students'
    cur.execute(use)
    for identi,name,gpa in students:
        query1 = 'INSERT INTO students (id,st_names,gpa) VALUES 
                                                     (%s,%s,%s)'
        cur.execute(query1,(identi,name,gpa))
    query = 'SELECT * FROM students'

    cur.execute(query)
    ids = [ide['id'] for ide in cur]

    cur.execute(query)
    names = [name['st_names'] for name in cur]

    cur.execute(query)
    gpas = [gpa['GPA'] for gpa in cur]

finally:
    conn.close()

当我仅在获得第一个ID列表后才执行查询时,打印ID,名称,gpas时。名称和GPA为空。

1 个答案:

答案 0 :(得分:2)

使用此表达式...

ids = [ide['id'] for ide in cur]

...在光标上进行迭代,这将耗尽迭代器。下次您对其进行迭代时,将没有任何东西可以循环,因此list comp返回一个空列表。
再次执行查询会创建一个新的迭代器,但是您必须对要检索的每个字段执行该操作。

每个符合DB API的游标都提供方法fetch,以{@ 3}}在游标中执行的SQL语句的结果(或其一部分)。

由于PyMySQL符合DB API,因此您可以使用这些methods。就您而言,您可能想去...

query = 'SELECT * FROM students'
cur.execute(query)
result = cur.fetchall()

...检索表示完整结果集的字典列表。

# [{'id': 1, 'st_names': 'Hubert', 'GPA': 4.0}, {'id': 2, 'st_names': 'Macia', 'GPA': 3.2}, ...]

顺便说一句,executemany()允许您进行批量插入,而无需手动循环查询参数序列:

query1 = 'INSERT INTO students (id,st_names,gpa) VALUES (%s,%s,%s)'
cur.executemany(query1, students)