Индексы вместо названий столбцов после выполнения sql запроса

Рейтинг: 1Ответов: 1Опубликовано: 03.04.2023

Имеется база на MS SQL, когда обращаюсь к ней следующим способом:

server = "sql-test"
user = "sa"
password = "sa"
database = "db-test"

conn = _mssql.connect(server,
                  user,
                  password,
                  database,
                  charset='cp1251')

# ввод даты в формате гггг-мм-дд для sql запроса
start_date = pd.to_datetime(input())
start_date = dt.datetime.strftime(start_date, '%Y%m%d')

def csc(conn, start_date):
   try:
    cursor = conn.cursor()

    cursor.execute("SELECT Data, Series, Count, Tariff \
                    FROM dbo.CardSeriesCount \
                    WHERE CAST(Data AS DATE) = %(P)s", {'P': start_date})

    csc_df = pd.DataFrame(cursor.fetchall())

   except:
       print('Error csc')

   finally:
      cursor.close()

   return csc_df

#--------------------------------------------------------------------

csc_df = csc(conn, start_date)

Названия столбцов при просмотре отображаются в виде их индексов (0, 1, и т.д.). Подскажите пожалуйста что и где надо поправить что бы потом не переименовывать столбцы ручками.

P.S.: Запросов несколько, из таблиц запрашиваются только определенные столбцы и иногда их много.

Ответы

▲ 1Принят

судя по сигнатуре функции connect, вы используете pymssql

В документации http://www.pymssql.org/en/stable/pymssql_examples.html сказано:

Rows as dictionaries

Rows can be fetched as dictionaries instead of tuples. This allows for accessing columns by name instead of index. Note the as_dict argument.

cursor = conn.cursor(as_dict=True)

Чтобы строки возвращались словарём (с доступом по имени), а не кортежем (с доступом по индексу), при создании курсора укажите, что вам нужен словарь.