Есть ли способ создать переменные, хранящие значения из столбцов в базе данных, не выполняя один и тот же запрос несколько раз в pymysql? - PullRequest
0 голосов
/ 05 июня 2019

Я создаю простую программу на 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()

Когда я печатал идентификаторы, имена, gpas, когда я выполнял запрос только один раз, когда я получил первый список идентификаторов.Имена и gpas были пусты.

1 Ответ

2 голосов
/ 05 июня 2019

С этим выражением ...

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

... вы перебираете курсор, который исчерпывает итератор. В следующий раз, когда вы выполните итерацию, вам просто не останется ничего зациклить, поэтому list comp возвращает пустой список.
Повторное выполнение запроса создает новый итератор, но вам придется делать это для каждого поля, которое вы хотите получить.

Каждый DB API-совместимый курсор предлагает методы для извлечения результата (или его частей) оператора SQL, который был выполнен в курсоре.

Поскольку PyMySQL соответствует API БД, эти методы доступны для вас. В вашем случае вы, вероятно, захотите пойти на ...

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)
...