Как сделать запрос в базе данных, используя значение словаря в python?

Например, у меня есть словарь: my_dict = {'2':'even','1':'odd','3':'odd'} И это моя база данных:

+---------+--------+ | Numeric | String | +---------+--------+ | 5 | five | | 4 | four | | 3 | three | | 2 | two | | 1 | one | +---------+--------+

В словаре my_dict, используя их keys, я хочу получить их значение String в моей базе данных (SQL SERVER) и, используя их values, отсортировать их значение String в этой последовательности:

odd - even - odd чтобы это понравилось

one two three.

И напечатайте вывод следующим образом: Let's count one two three. На самом деле я просто основывался на вопросе Джису Запрос списка кортежей в базе данных, потому что мы очень похожи, но в моем случае это примерно Словарь.


person Community    schedule 06.03.2015    source источник
comment
Можете ли вы уточнить предполагаемый порядок сортировки? Потому что ('even', 'odd', 'odd') не имеет полного порядка, то есть порядок был бы неоднозначным, как я его прочитал.   -  person dhke    schedule 06.03.2015
comment
О да, извините, я не понял это таким образом. Давайте просто проигнорируем последовательность и сортировку вместо этого, используя их значения, отобразим String значения keys как это two is divisible by 2, one is not divisible by 2, three is not divisible by 2.   -  person    schedule 06.03.2015


Ответы (1)


У этого вопроса есть две стороны: первая — это часть SQL-запроса. Это проще:

Предполагая, что таблица базы данных похожа на

 CREATE TABLE number (value INTEGER, name STRING);

SQL более или менее прост

 from contextlib import closing

 [...]

 my_dict = {'2':'even','1':'odd','3':'odd'}

 # database connection dbc, see python dbapi
 with closing(dbc.cursor()) as cur:
     cur.execute('SELECT value, name FROM number WHERE value IN (1, 2, 3)')
     for value, name in cur:              
         print "%s is %s" % (name, my_dict[str(value)])

Проблема python здесь заключается в том, чтобы получить ключи словаря в предложении SQL IN, поскольку это невозможно напрямую с расширением параметра DBAPI2 (см. db-execute-for-where-in-int-list">здесь).

Следовательно:

 my_dict = {'2':'even','1':'odd','3':'odd'}

 # database connection dbc, see python dbapi
 with closing(dbc.cursor()) as cur:
     stmt = 'SELECT value, name FROM number WHERE id IN (%s)' % ','.join('?' for i in my_dict))
     cur.execute(stmt, my_dict.keys())
     for value, name in cur:              
         print "%s is %s" % (name, my_dict[str(value)])

Один из них также заключается в том, что '?' зависит от стиля используемой базы данных.

person dhke    schedule 06.03.2015
comment
Я использую соединение pypyodbc odbc, сэр. Возможно ли это? - person ; 06.03.2015
comment
Извините, я не могу вам помочь. Однако пометка pypyodbc в вашем вопросе может помочь. - person dhke; 06.03.2015
comment
Спасибо, сэр, за ответ. Я думаю, что я должен попробовать dbc, чтобы увидеть, как это работает. - person ; 06.03.2015