У меня есть несколько пар ключ: значение в словаре
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?