Я пытаюсь получить список значений скорости из моей таблицы в моей базе данных. Мне было интересно, была ли это команда/метод SQL, которая позволила бы мне передать список CharID в функции WHERE, чтобы мне не пришлось создавать цикл FOR и выполнять четыре поиска отдельно.
party_ids= [4, 3, 1, 2]
def initializegame(party_ids):
#Get selected party members IDS
print(party_ids)
#Obtain Speeds
fetchspeed=("SELECT startspeed FROM characters WHERE CharID=%s")
print(fetchspeed)
mycursor.execute(fetchspeed,party_ids)
myspeeds=mycursor.fetchall()
print(myspeeds)
print("done")
Я относительно новичок в SQL, и я могу упустить что-то важное.
Я пробовал: передача списка в предложение where Тем не менее, это было слишком сложно для понимания.
заранее спасибо






Вы можете использовать ключевое слово IN для фильтрации на основе списка.
party_ids= [4, 3, 1, 2]
def initializegame(party_ids):
#Get selected party members IDS
print(party_ids)
#Obtain Speeds
ids_string = ','.join(str(id) for id in party_ids)
mycursor.execute("SELECT startspeed FROM characters WHERE CharID IN ({0})".format(ids_string))
myspeeds=mycursor.fetchall()
print(myspeeds)
print("done")
Вы можете найти больше информации о ключевом слове IN и о том, как оно работает, из этого Учебник по блогу MySQL.
Используйте ключевое слово В, если у вас есть несколько значений, по которым вы фильтруете. В этом случае у вас есть известные целочисленные значения, поэтому внедрение SQL не является проблемой. Но ваша функция была написана так, что ей могли быть переданы произвольные значения, где SQL-инъекция могла быть проблемой, или вам могли быть переданы строковые литералы, которые необходимо экранировать. Поэтому стоит решить эти проблемы, позволив драйверу базы данных обрабатывать фактические параметры:
party_ids= [4, 3, 1, 2]
def initializegame(party_ids):
#Get selected party members IDS
print(party_ids)
#Obtain Speeds
in_params = ','.join(['%s'] * len(party_ids))
sql = "SELECT startspeed FROM characters WHERE CharID IN (%s)" % in_params
mycursor.execute(sql, party_ids)
myspeeds=mycursor.fetchall()
print(myspeeds)
print("done")
Переменная SQL становится:
SELECT startspeed FROM characters WHERE CharID IN (%s,%s,%s,%s)
Затем оператор выполнять передает в качестве второго параметра список из 4 значений В.
Этот код широко открыты для SQL-атак. Использовать ли нет форматирование строк для интерполяции значений.
party_ids = ["''; DROP TABLE characters"]удалитcharactersтаблицу из базы данных в момент запуска этой функции.