Я пытаюсь выполнить массовую вставку длинных строк 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, но не нашел решения:
$$
, чтобы вам не пришлось избегать и этого? - person Peter Eisentraut   schedule 28.10.2011