написать запрос на вставку для вставки динамики c количество столбцов фрейма данных в таблицу cassandra, используя python - PullRequest
0 голосов
/ 25 мая 2020

У меня есть таблица cassandra с 30 столбцами и фрейм данных, который будет содержать любое количество столбцов, выбранное пользователем или загруженное пользователем в виде файла csv.

например. моя таблица cassandra имеет 30 имен каналов, таких как channel_1, channel_2 .. channel_30, и несколько дополнительных столбцов, таких как product, region et c. и мой фрейм данных имеет 5 имен каналов, таких как channel_1, channel_2..channel_5 и 2 дополнительных столбца: дата и имя модели, как мне написать запрос вставки, который выполняет итерацию по моим столбцам фрейма данных и создает запрос следующим образом:

data = pd.DataFrame()
...
for _, row in data.iterrows():

            session.execute("""INSERT INTO cass_table (product, region , model, date, (channel names in dataframe ex.channel_1, \
                    channel_2, channel_3, channel_4, channel_5) \
                    VALUES (%s, %s, %s, %s, <no of channels: %s, %s, %s, %s, %s>)""" ,\
                    (product, region, row['model_name'], row['date'], <other remaining columns like row["channel_1"], row["channel_2"],\
                    row["channel_3"], row["channel_4"], row["channel_5"]>))

Я пробовал это:

channel_list = ['channel_1', 'channel_2', 'channel_3', 'channel_4', 'channel_5']
session.execute("""INSERT INTO cass_table(product, region , model, date, \
                    """ + str(' ,'.join('channel_{}_cont'.format(i) for i,c in enumerate(channel_list, 1))) + """) ,\
                    VALUES (%s, %s, %s, %s"""+ str(''.join(', %s'*no_of_channels)), """)""" \
                    (product, region, row['model_name'], row[date_col] , ','.join(row["'"+channel_list+"'"])))

, но это дает ошибку: «str object is not callable»

Как мне продолжить?

1 Ответ

0 голосов
/ 25 августа 2020

На практике это должно работать, но в том, как вы пишете свой запрос, есть несколько ошибок.

  • Вам не хватает , между шаблоном запроса и значениями
  • При генерации кортежа вставляемых значений вы хотите использовать оператор *. Он будет использовать каждый элемент списка в качестве аргумента функции. см. Этот вопрос
query = (
    "INSERT INTO cass_table (product, region , model, date, "
    + ', '.join(channel_list) + ') '
    + " VALUES (%s, %s, %s, %s, " + ', '.join(['%s'] * len(channel_list)) + ")"
)

values = (product, region, row['model_name'], row[date_col] , *[row[c] for c in channel_list])
session.execute(query, values)
...