2011-10-28 29 views
2

我想將一個長xml字符串作爲文本插入到postgresql 9.1數據庫中。我正在使用Python 3.2和pyscopg2。我在$$中包含xml字符串,並在查詢字符串中使用命名變量。例如:用python插入大文本數據到postgres中

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) 

我的問題是如何做到使用命名變量和$$大文本數據的批量插入。如果可能的話,我並不希望必須預先或後期處理此字符串,因爲它們可能較大並且包含未知數量的單引號或需要分隔的其他符號。 我已閱讀下列文件和搜查計算器的答案,但還沒有找到解決辦法:

+0

是什麼讓你如此確信你的大文本數據不包含'$$',這樣你就不必逃避? –

+0

如果我的理解是正確的,那麼你不必擔心字符串中的任何$。引自Postgresql文檔:4.1.2.4。美元引用的字符串常量 - 注意,在美元引用的字符串中,可以使用單引號而不需要轉義。實際上,美元引用的字符串內部沒有任何字符可以逃脫:字符串內容總是按字面意思寫出來的。反斜槓不是特殊的,也不是美元符號,除非它們是匹配開始標記的序列的一部分。 – mcfar

+0

你應該擔心。看到你引用的最後一句話。 –

回答

1

總結評論跟帖。這樣做:

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佔位符不把雙引號中查詢。司機的工作是在必要時引用價值。