Экранирование одинарных кавычек для массовой вставки во временную таблицу, а затем копирование в основнуюPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Экранирование одинарных кавычек для массовой вставки во временную таблицу, а затем копирование в основную

Сообщение Anonymous »

У меня есть фрейм данных со столбцами, которые могут содержать одинарные кавычки в данных. я записываю эту таблицу во временную таблицу, а затем выбираю ее в реальную таблицу, чтобы выполнить обновление (вставка или конфликт, обновление).
Это то, что мой sql для создания временной таблицы таблица в postgres выглядит так:

Код: Выделить всё

sql_create=f'drop table if exists tmp_tbl; CREATE TEMPORARY TABLE tmp_tbl ON COMMIT DROP AS SELECT {cols} FROM {table_name} LIMIT 0;'
Перед попыткой массовой вставки я экранирую данные и подтверждаю, что после экранирования данные заключены в двойные одинарные кавычки для мест, где были одинарные кавычки.
Вот код для вставки кадра данных во временную таблицу:

Код: Выделить всё

try:
with psycopg.connect(self.connect_str, autocommit=False) as conn:
io_buf = io.StringIO()
df.to_csv(io_buf, sep='\t', header=False, index=False)
io_buf.seek(0)

with conn.cursor() as cur:
cur.execute(sql_create)
with cur.copy(sql_copy) as copy:
while data:=io_buf.read(self.batch_size):
copy.write(data)

cur.execute(sql_full)

except Exception as ex:
self.log.error(ex)
raise ex
(sql_full выполняет выборку в основной таблице. Здесь это не очень актуально, поскольку данные попадают в таблицу tmp с двойными одинарными кавычками.)Я тоже не уверен, что это актуально, поскольку уже упоминал, что проверил, что данные правильно экранируются к моменту начала копирования, но вот escape-код:

Код: Выделить всё

   @staticmethod
def escape_df(df):
# for col in df.select_dtypes(include=['object']):
#    df[col] = np.array([str(item).replace("'", "''") for item in df[col].values])
# return df
for col in df.select_dtypes(include=['object']):
df[col] = np.where(df[col].str.contains("''"),
df[col],
df[col].str.replace("'", "''"))
return df
Кажется, что это всегда приводит к тому, что данные попадают в базу данных postgres в том виде, в каком они появляются в кадре данных (экранированы двойными кавычками).
Я пробовал экранировать с помощью 4 одинарных кавычек , то же самое.
Я пробовал использовать csv.QUOTE_NONE, csv.QUOTE_MINIMAL, все то же самое.
у кого-нибудь есть мысли, как решить это?

Подробнее здесь: https://stackoverflow.com/questions/791 ... py-to-main
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»