Вставка больших текстовых данных в postgres с помощью python - PullRequest
2 голосов
/ 28 октября 2011

Я пытаюсь выполнить массовую вставку длинных строк XML в виде текста в базу данных postgresql 9.1. Я использую Python 3.2 и pyscopg2. Я заключаю строку XML в $$ и использую именованную переменную в строке запроса. Например:

query = "insert into cms_object_metadata (cms_object_id, cms_object_metadata_data, cms_object_metadata_type_id, \
         cms_object_metadata_status_id) values ((select id from cms_objects where cms_object_ident = %(objIdent)s), \
         $$%(objMetaString)s$$, (select id from cms_object_metadata_types where cms_object_metadata_type_name = 'PDAT'), \
         (select id from cms_object_metadata_status where cms_object_metadata_status_name = 'active'))"

Затем я создаю объект словаря следующим образом:

dataDict = {'objIdent':objIdent, 'objMetaString':objMetaString}

передача значений objIdent и objMetaString. Я делаю вставку со следующим кодом:

dbCursor.execute(query, dataDict)

Когда он вставляет значение objMetaString в базу данных, он содержит одинарные кавычки вокруг строки. Если я добавлю значения в строку запроса и выполню вставку без именованной переменной, это не так. Например:

query = "insert into cms_object_metadata (cms_object_id, cms_object_metadata_data, cms_object_metadata_type_id, \
         cms_object_metadata_status_id) values ((select id from cms_objects where cms_object_ident = %s), \
         $$%s$$, (select id from cms_object_metadata_types where cms_object_metadata_type_name = 'PDAT'), \
         (select id from cms_object_metadata_status where cms_object_metadata_status_name = 'active'))" % (objIdent, objMetaString)

и вставка:

dbCursor.execute(query)

Мой вопрос заключается в том, как выполнить массовую вставку больших текстовых данных с использованием именованных переменных и $$. На самом деле я не хочу, чтобы эта строка была предварительно или постобработана, если это возможно, поскольку они могут быть большими и содержать неизвестное количество одинарных кавычек или других символов, которые необходимо разделить. Я прочитал следующую документацию и искал ответ на stackoverflow, но не нашел решения:

1 Ответ

1 голос
/ 02 ноября 2011

Подведение итогов в комментариях. Сделайте это:

query = "insert into cms_object_metadata (cms_object_id, cms_object_metadata_data, cms_object_metadata_type_id, \
         cms_object_metadata_status_id) values ((select id from cms_objects where cms_object_ident = %(objIdent)s), \
         %(objMetaString)s, (select id from cms_object_metadata_types where cms_object_metadata_type_name = 'PDAT'), \
         (select id from cms_object_metadata_status where cms_object_metadata_status_name = 'active'))"

dataDict = {'objIdent':objIdent, 'objMetaString':objMetaString}

dbCursor.execute(query, dataDict)

Не ставьте кавычки вокруг %(objMetaString)s заполнителя в вашем запросе. Задача водителя заключать в кавычки значение, если это необходимо.

...