INSERT в базе данных PostgreSQL с использованием PyQt4.QtSql.QSqlQuery () - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть несколько пар ключ: значение в словаре

fields_to_insert = {'f_table_schema': u'grunddaten',
'update_time': PyQt4.QtCore.QDateTime(2018, 11, 5, 11, 29, 39, 240),
'f_table_catalog': u'liegenschaften',
'description': u'bla',
'styleqml': u'<!DOCTYPE qgis PUBLIC \'http://mrcc.com/qgis.dtd\' \'SYSTEM\'> ...',
'useasdefault': False,
'stylesld': u'<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" ...',
'owner': u'postgres',
'ui': NULL,
'f_table_name': u'flurstueck_teil',
'stylename': u'lis flstteil style_copy',
'f_geometry_column': u'geom'}

(сокращено содержимое xml)

и попробуйте вставить их в таблицу PostgresSQL public.layer_styles следующим образом:

query = QSqlQuery(self.qdb) #self.qdb is a successfuly opened QSqlDatabase with QPSQL driver
query.prepare("""INSERT INTO public.layer_styles
(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, description, owner, ui, update_time)
VALUES (:f_table_catalog, :f_table_schema, :f_table_name, :f_geometry_column, :stylename_new, XMLPARSE(:styleqml), XMLPARSE(:stylesld), :useasdefault, :description, :owner, XMLPARSE(:ui), :update_time);""")

for att in fields_to_insert.keys():
    query.bindValue(':{0}'.format(att), fields_to_update[att])

print(query.lastQuery())
query.exec_()
print(query.executedQuery())
print(query.lastError().text())

приводит к следующей ошибке:

INSERT INTO public.layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, description, owner, ui, update_time) VALUES (:f_table_catalog, :f_table_schema, :f_table_name, :f_geometry_column, :stylename_new, XMLPARSE(:styleqml), XMLPARSE(:stylesld), :useasdefault, :description, :owner, XMLPARSE(:ui), :update_time);

INSERT INTO public.layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, description, owner, ui, update_time) VALUES (?, ?, ?, ?, ?, XMLPARSE(?), XMLPARSE(?), ?, ?, ?, XMLPARSE(?), ?);

FEHLER:  Syntaxfehler bei »(«
LINE 1: EXECUTE  ('liegenschaften', 'grunddaten', 'flurstueck_teil',...
             ^
(42601) QPSQL: Unable to create query

Зная, что этот подход строго запрещен, я попробовал следующее без QSqlQuery.bindValue(), но вместо этого подготовил запрос вручную, используя форматирование строки:

fields_to_insert['update_time'] = QDateTime.currentDateTime().toString(Qt.ISODate)
fields_to_insert['useasdefault'] = 'false'
sql = (u"""INSERT INTO public.layer_styles
    (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, description, owner, ui, update_time) VALUES
    ('{f_table_catalog}', '{f_table_schema}', '{f_table_name}', '{f_geometry_column}', '{stylename}', XMLPARSE({styleqml}), XMLPARSE({stylesld}), '{useasdefault}', '{description}', '{owner}', XMLPARSE({ui}), '{update_time}');""".format(**fields_to_insert))
query = QSqlQuery(sql, self.qdb)
query.exec_()
print(query.executedQuery())
print(query.lastError().text())

дает мне тот же результат.

Я нашел несколько похожих постов, таких как

Среда: Python 2.7, Qt 4.8, PostgreSQL 9.6

Я думаю, что запрос правильный, а также использование bindValues() s, и я не мог понять, проблема в моем коде или из-за ошибки в драйвере QPSQL.

Существуют ли предлагаемые обходные пути для ВСТАВКИ чего-либо в базу данных PostgreSQL с использованием QSqlQuery из PyQt?

...