PyQt - с использованием QSqlRelationalTableModel - model.select () заполняется QSQLITE, а не psycopg2 - PullRequest
0 голосов
/ 28 ноября 2011

В этом распространенном примере:

from PyQt4 import QtCore, QtGui, QtSql
import psycopg2 as psycopg
import sys

#try:
conn = psycopg.connect("dbname='metalarc1' user='postgres' host='192.168.1.136'       
    password='admin' port='5433'");
#except:
#    print "I am unable to connect to the database"

def initializeModel(model):
#    cur.execute("""select * from employee""")
#    rows = cur.fetchall()
    model.setTable("employee")
    model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
    model.setRelation(2, QtSql.QSqlRelation('city', 'id', 'name'))
    model.setRelation(3, QtSql.QSqlRelation('country', 'id', 'name'))

    model.setHeaderData(0, QtCore.Qt.Horizontal, "ID")
    model.setHeaderData(1, QtCore.Qt.Horizontal, "Name")
    model.setHeaderData(2, QtCore.Qt.Horizontal, "City")
    model.setHeaderData(3, QtCore.Qt.Horizontal, "Country")
    model.select()

def createView(title, model):
    view = QtGui.QTableView()
    view.setModel(model)
    view.setItemDelegate(QtSql.QSqlRelationalDelegate(view))
    view.setWindowTitle(title)

    return view

def createRelationalTables():
    query = QtSql.QSqlQuery()
    cur.execute("""create table employee(id int primary key not null, name 
           varchar(20), city int, country int)""")
    cur.execute("""insert into employee values(1, 'Espen', 5000, 47)""")
    cur.execute("""insert into employee values(2, 'Harald', 80000, 49)""")
    cur.execute("""insert into employee values(3, 'Sam', 100, 41)""")
    cur.execute("""create table city(id int primary key not null, name varchar(20))""")
    cur.execute("""insert into city values(100, 'San Jose')""")
    cur.execute("""insert into city values(5000, 'Oslo')""")
    cur.execute("""insert into city values(80000, 'Munich')""")
    cur.execute("""create table country(id int primary key not null, name     varchar(20))""")
    cur.execute("""insert into country values(41, 'USA')""")
    cur.execute("""insert into country values(47, 'Norway')""")
    cur.execute("""insert into country values(49, 'Germany')""")

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    createRelationalTables()
    model = QtSql.QSqlRelationalTableModel()
    initializeModel(model)
    view = createView("Relational Table Model", model)
    view.show()
    sys.exit(app.exec_())

Таблицы создаются хорошо и заполнены. Но model.select () возвращает False, и представление отображается пустым (без заголовков столбцов или данных).
Когда я запускаю тот же код с базой данных QSQLITE, он работает нормально. Я чувствую, что это должно быть очень просто, так как данные есть, если я:

cur.execute("""select * from employee""")
rows = cur.fetchall()
rows[0]
(1, 'Espen', 5000, 47)

Я мог бы наверняка использовать некоторую помощь - боролся с этим в течение 2 дней. Спасибо

1 Ответ

0 голосов
/ 28 ноября 2011

Вам необходимо подключиться к базе данных PostgreSQL, используя QSqlDatabase вместо импорта psycopg2.

(питонизированный) пример подключения из документации :

db = QSqlDatabase.addDatabase("QPSQL")
db.setHostName("acidalia")
db.setDatabaseName("customdb")
db.setUserName("mojito")
db.setPassword("J0a1m8")
ok = db.open()

Когда вы используете QSqlQuery и QSqlRelationalTableModel.setTable(), они используют ваше соединение по умолчанию QSqlDatabase, если вы не указали имя соединения при их создании.В приведенном выше примере у вас его нет - я предполагаю, что при использовании базы данных QSQLITE это QSqlDatabase?

...