Как я могу взять один столбец из запроса SQL и добавить его в список в Python - PullRequest
1 голос
/ 17 июня 2019

У меня есть SQL-запрос, который будет искать в базе данных и возвращать одну строку, содержащую как минимум 3 разных столбца, следующим образом:

SELECT
  `epg_num` AS `epgNum`,
  `service_key` AS `serviceKey`,
  `service_name` AS `channelName`
FROM `ssr_services`
WHERE `epg_num` = %(channelValue)s

Мне требуется только чтобы служебный ключ был добавлен в список в моем коде.

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

Пользователь будет указывать epg_num при запуске кода. Который затем вернет строку в SQL с указанием epg_num, служебного ключа и служебного имени

Импорт:

import sys
import os
import MySQLdb
from subprocess import check_output, CalledProcessError
from collections import OrderedDict

from UPnP.core.proxy import ServerProxy
from Data_Types import PlannerExportEvent, PlannerExportResponse, UpnpError, Result, Channel, Event, Shelf
from Database_Connection import FetchAll, FetchOne
from Decorators import ResetRetry, Suppress
from Logs import Logging
from Utilities import GetRecycID, GetRackID, Wait

Код, который у меня есть на данный момент, следующий:

        if epgNumsList:
            serviceKeysList = self.GetMultiChannelInfo(epgNumsList=epgNumsList)
            print(serviceKeysList)
            whereString = "(epg_num IN ({epgNumsList}) AND epg_num LIKE '___')".format(epgNumsList=','.join(epgNumsList))

Который использует следующее:

    def GetMultiChannelInfo(self, epgNumsList=None):
        serviceKeys = []
        for epgNum in epgNumsList:
            retObj = self.GetChannelInfo(epgNum=epgNum)
            result = retObj.Result()
            if result:
                channelObj = retObj.Data()
                result = channelObj.serviceKey
                serviceKeys.append(result)
                print(result)

            else:
                print('Channel not found')
        print(serviceKeys)
        return Result(serviceKeys)

Я вижу следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\MHE36\workspace\Scripts\SkyPlus__UPnP_Set_Recordings.py", line 42, in <module>
    upnp.BackgroundRecordings(recordings, epgNumsList, serviceKeysList, duration)
  File "C:\Users\MHE36\workspace\Libraries\SuperPlanner.py", line 1154, in BackgroundRecordings
    print(serviceKeysList)
  File "C:\Users\MHE36\workspace\Libraries\Data_Types.py", line 32, in __repr__
    return 'Result (Result: {result}, Data: {data}, NumFailures: {numFailures})'.format(result=self.result, numFailures=self.numFailures)
KeyError: 'data'

Я думаю, что трассировка связана с этим битом кода из другого модуля:

def __repr__(self):
        return 'Result (Result: {result}, Data: {data}, NumFailures: {numFailures})'.format(result=self.result, numFailures=self.numFailures)

Надеюсь, это даст достаточно подробностей, но с удовольствием предоставит больше, если необходимо.

Заранее спасибо.

1 Ответ

0 голосов
/ 17 июня 2019

Как вы выполняете этот запрос? с pyodbc? тогда вы можете превратить эту строку в словарь

columns = [column[0] for column in cursor.description]
list_of_dict =[]
for dict in cursor.fetchall():
    list_of_dict.append(dict(zip(columns, dict)))

распечатайте этот list_of_dict, и вы все поймете.

Примечание: вы не должны выполнять другие запросы перед выполнением этого блока кода, потому что курсор будет обновлен.

Я предлагаю вам получить доступ к этому списку и вернуть то, что вы хотите, во время выполнения этого запроса по какой-то причине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...