Получение данных из SQL Использование pyodb c через Set Computing дает нехешируемый тип: 'pyodb c .Row' - PullRequest
0 голосов
/ 04 августа 2020

Мне нужно запустить операторы SELECT для списка файлов в наборе. Я использую следующий фрагмент кода:

def flist_in_psumsdb(config, fnames_set_in_psumsdictlist):
    constring = config['db_string## Heading ##']['db_string']
    cnxn = pyodbc.connect(constring)
    cnxnset = {  row for row in  {(cnxn.execute(f"""SELECT LOG FROM {config['db_string']['bd_psums_meta_table_str']} where LOG = '{log}'  """)).fetchone() for log in fnames_set_in_psumsdictlist} }
    cnxn.close()

Однако, когда я запускаю его, я получаю сообщение об ошибке:

  File "c:\Users\sys_nsgprobeingestio\Documents\dozie\odfs\etesthad4.py", line 458, in <setcomp>
    cnxnset = {  row for row in       {(cnxn.execute(f"""SELECT LOG FROM {config['db_string']['bd_psums_meta_table_str']} where LOG = '{log}'  """)).fetchone() for log in fnames_set_in_psumsdictlist} }
TypeError: unhashable type: 'pyodbc.Row'

Идея состоит в том, чтобы выполнить итерацию cnxset и вернуть список файлов журнала из строки pyodb c, например:

filelist = {row.LOG for row in cnxnset}

, где LOG - это, конечно, столбец из sql оператора select

1 Ответ

2 голосов
/ 04 августа 2020

Учитывая итерацию имен журналов, их можно получить с помощью запроса IN.

Сначала нам нужно создать предложение подстановки значений:

names = fnames_set_in_psumsdictlist

subs = ', '.join(['?' for name in names])

Теперь мы можем построить полный запрос и выполнить его.

q = f"""SELECT LOG 
FROM {config['db_string']['bd_psums_meta_table_str']} 
WHERE LOG IN ({subs}); """

cursor.execute(q, names)
rows = cursor.fetchall()

Обратите внимание, что разные драйверы баз данных имеют разные параметры подстановки - pyodb c использует '?', некоторые другие используют '%s'. Использование параметров подстановки вместо строковой интерполяции гарантирует, что значения правильно указаны в запросе.

...