Автоматическое расширение списка Python с форматированным выводом - PullRequest
6 голосов
/ 25 ноября 2008

Кто-нибудь знает, есть ли способ автоматического расширения списка в Python, разделенного запятыми? Я пишу некоторый код Python, который использует библиотеку MySQLdb, и пытаюсь динамически обновлять список строк в базе данных MySQL с определенными значениями ключей.

Например, в приведенном ниже коде я хотел бы, чтобы числовые значения в списке record_ids расширились до предложения SQL "IN".

import MySQLdb
record_ids = [ 23, 43, 71, 102, 121, 241 ]

mysql = MySQLdb.connect(user="username", passwd="secret", db="apps")
mysql_cursor = mysql.cursor()

sqlStmt="UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in ( %s )"

mysql_cursor.execute( sqlStmt, record_ids )
mysql.commit()

Любая помощь будет оценена!

Ответы [ 5 ]

18 голосов
/ 25 ноября 2008

попробовать:

",".join( map(str, record_ids) )

",".join( list_of_strings ) объединяет список строк, разделяя их запятыми

если у вас есть список чисел, map( str, list ) преобразует его в список строк

2 голосов
/ 25 ноября 2008

В дополнение к приведенным ответам, обратите внимание, что вам может потребоваться особый случай с пустым списком, поскольку "where rec_id in ()" не является допустимым SQL, поэтому вы получите ошибку.

Также будьте очень осторожны при построении SQL вручную, а не просто при использовании автоматически экранированных параметров. Для списка целых чисел это будет работать, но если вы имеете дело со строками, полученными из пользовательского ввода, вы открываете огромную уязвимость SQL-инъекций, делая это.

1 голос
/ 25 ноября 2008

Я делаю что-то вроде этого (чтобы убедиться, что я использую привязки):

sqlStmt=("UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in (%s)"
    % ', '.join(['?' for n in record_ids]))

mysql_cursor.execute(sqlStmt, record_ids)
mysql.commit()

Это работает для всех динамических списков, которые вы хотите связать, не оставляя вас подверженным атакам SQL-инъекций.

0 голосов
/ 30 июня 2010

Альтернативно, используя заменить :

sqlStmt="UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in " +
    record_ids.__str__().replace('[','(').replace(']',')')
0 голосов
/ 25 ноября 2008

Немного другая альтернатива ответу Дастина:

sqlStmt=("UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in (%s)"
    % ', '.join(['?' * len(record_ids])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...