2011-11-27 23 views
0

在这个常见的例子:PyQt的 - 使用QSqlRelationalTableModel - model.select()与QSQLITE填充,不psycopg2

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天。谢谢

回答

0

您需要使用QSqlDatabase连接到PostgreSQL数据库,而不是导入psycopg2。

A(pythonised)连接from the docs的例子:

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

当您使用QSqlQueryQSqlRelationalTableModel.setTable()他们使用默认QSqlDatabase连接,除非您创建它们时指定的连接名称。在你的上面的例子中,你没有一个 - 我猜你在使用'QSQLITE'数据库时是QSqlDatabase

+0

非常感谢。我认为我越来越接近但仍然没有数据。几件事情: –

+0

我仍然没有看到QPSQL或ODBC如何在没有驱动程序的情况下工作。我确实有 –

+0

你在哪个平台上?在使用http://riverbankcomputing.co.uk的PyQt二进制安装程序的Windows下,您的 \ Lib \ site-packages \ PyQt4 \ plugins \ sqldrivers文件夹中应该有qsqlpsql4.dll。调用QSqlDatabase.drivers()应该告诉你你有什么可用的。 –