2011-11-27 22 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()應該告訴你你有什麼可用的。 –