2017-09-22 23 views
1

複数のQTウィジェットからレコードを作成してデータベースに保存したい。次のスクリプトはエラーなしで実行されますが、レコードは保存されません。問題の一部は、すでにデータベースにある最後のIDを特定できないということですが、手動でIDを設定しても何も書き込まれません。私はinsertRecordを使ってオンラインでの例を見たことがありますが、QTのドキュメントではinsertRowを使って示唆しています。私のアプローチを修正してください。私はPythonとQtの初心者です。PySideのSQLデータベースに単一のレコードを書き込む

import sys 
from PySide.QtCore import * 
from PySide.QtGui import * 
from PySide.QtSql import * 


class MainWindow(QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

     #Make Database 
     self.db = QSqlDatabase.addDatabase('QSQLITE') 
     self.db.setDatabaseName('C:/Users/dle/Documents/example1.sqlite') 
     self.db.open() 
     self.db.transaction() 
     self.db.exec_(
      'CREATE TABLE t1' 
      '(id INTEGER PRIMARY KEY, f1 INTEGER NOT NULL, f2 INTEGER NOT NULL, f3 TEXT NOT NULL)' 
     ) 
     self.db.exec_("INSERT INTO t1 VALUES(1, 10, 20, 'db works fine')") 
     self.db.commit() 

     #Create User Interface 
     self.f1 = QLineEdit() 
     self.f2 = QLineEdit() 
     self.f3 = QLineEdit() 

     self.storeButton = QPushButton("Store") 
     self.storeButton.clicked.connect(self.doStore) 

     vlayout = QVBoxLayout() 
     vlayout.addWidget(self.f1) 
     vlayout.addWidget(self.f2) 
     vlayout.addWidget(self.f3) 
     vlayout.addWidget(self.storeButton) 

     widget = QWidget() 
     widget.setLayout(vlayout) 

     self.setCentralWidget(widget) 

    def doStore(self): 
     self.dbModel = QSqlTableModel(self) 
     self.dbModel.setTable('t1') 
     ID = self.dbModel.query().lastInsertId() #this returns "None" even though last ID 
                #in table is 1 
     thisRecord = QSqlRecord 
     thisRecord = self.dbModel.record() 
     thisRecord.setValue(0, ID)     # Does not write, even if ID is integer 
     print ID 
     thisRecord.setValue(1, int(self.f1.text())) 
     print int(self.f1.text()) 
     thisRecord.setValue(2, int(self.f2.text())) 
     print int(self.f2.text()) 
     thisRecord.setValue(3, self.f3.text()) 
     print self.f3.text() 
     print thisRecord 
     self.dbModel.insertRecord(ID, thisRecord) # Does not write, even if ID is integer 
                # Doesn't record field 0 already have ID? 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    mainwindow = MainWindow() 
    mainwindow.show() 
    sys.exit(app.exec_()) 
+0

挿入後に 'commit()'する必要がありますか?私は 'Qt'も知らないが、テーブルを作成した後に' self.db.commit() 'をここでコミットする。 – roganjosh

+0

IDを増やした要素を追加しますか? – eyllanesc

+0

'lastInsertId()'呼び出しは、モデル自体が挿入を行わなかったので 'None'を返します。 – ekhumoro

答えて

1

あなたはdocsに応じているので、インデックスを示す必要はなく、テーブルの最後に行を挿入したい場合:(

PySide.QtSql.QSqlTableModel.insertRecord行、レコード

パラメータ:

row - PySide.QtCore.int 

record – PySide.QtSql.QSqlRecord 

再ターンタイプ:

PySide.QtCore.bool 

行の後にレコードを挿入します。行が負の場合、レコードは最後に が追加されます。内部でPySide.QtSql.QSqlTableModel.insertRows()PySide.QtSql.QSqlTableModel.setRecord()を呼び出します。

行を挿入できる場合はtrueを、それ以外の場合はfalseを返します。

上記から、行= -1としてのみ使用すると結論づけることができます。

self.dbModel.insertRecord(-1, record) 

最善のことは一度としませdoStore関数が呼び出されるたびにモデルを作成することです、それはとロードされていますように、我々はまた、レコード()関数の助けを借りて、モデルのQSqlRecordを使用する必要があります。フィールド名。

class MainWindow(QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.db = QSqlDatabase.addDatabase('QSQLITE') 
     self.db.setDatabaseName('example1.sqlite') 
     self.db.open() 
     self.db.transaction() 
     self.db.exec_(
      'CREATE TABLE t1' 
      '(id INTEGER PRIMARY KEY, f1 INTEGER NOT NULL, f2 INTEGER NOT NULL, f3 TEXT NOT NULL)' 
     ) 

     self.db.commit() 
     self.db.exec_("INSERT INTO t1 VALUES(1, 10, 20, 'db works fine')") 

     #Create User Interface 
     [...] 
     self.setCentralWidget(widget) 

     self.dbModel = QSqlTableModel(self) 
     self.dbModel.setTable('t1') 

    def doStore(self): 
     record = self.dbModel.record() 
     record.setValue(1, int(self.f1.text())) 
     record.setValue(2, int(self.f2.text())) 
     record.setValue(3, self.f3.text()) 
     if not self.dbModel.insertRecord(-1, record): 
      print(self.db.lastError().text()) 
+0

ありがとうございます!私はinsertRecordの-1を見落としていました。それが問題を解決しました。 – davideps

関連する問題