После настройки модели таблицы следующим образом:
from PyQt4.QtSql import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sysdef createConnection(driverType, databaseName, hostName=None, userName=None, password=None):
db = QSqlDatabase.addDatabase(driverType);
db.setDatabaseName(databaseName)
db.setHostName(hostName);
db.setUserName(userName);
db.setPassword(password)
if (db.open() == False):
QMessageBox.critical(None, "Database Error", db.lastError().text())
return False
return dbif __name__ == '__main__':
app = QApplication(sys.argv)
con = createConnection('QSQLITE', "testdatabase.db")
qry = QSqlQuery()
qry.setForwardOnly(True)
qry.prepare("CREATE TABLE IF NOT EXISTS names (id INTEGER UNIQUE PRIMARY KEY, firstname VARCHAR(30), lastname VARCHAR(30))");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Table createdFalse==");
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (1, 'John', 'Doe')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (2, 'Jane', 'Doe')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (3, 'James', 'Doe')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (4, 'Judy', 'Doe')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (5, 'Richard', 'Roe')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (6, 'Jane', 'Roe')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (7, 'John', 'Noakes')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (8, 'Donna', 'Doe')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (9, 'Ralph', 'Roe')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
qry.prepare("SELECT id, firstname, lastname FROM names");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("SelectedFalse==");
print(con.tables(), con.primaryIndex('names').name(), con.record('names')) # #########################
while (qry.next()):
# print(qry.boundValues())
country = qry.value(1)
print(country)
rec = qry.record()
cols = rec.count();
for c in range(cols):
print("Column {}: {}" .format(c, rec.fieldName(c)))
qry.prepare("SELECT firstname, lastname FROM names WHERE lastname = 'Roe'" );
if (qry.exec_()==False ):
print(qry.lastError().text())
else:
print("SelectedFalse==" );
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (:id, :firstname, :lastname)" );
qry.bindValue(":id", 9 );
qry.bindValue(":firstname", "Ralph" );
qry.bindValue(":lastname", "Roe" );
if(False==qry.exec_()):
print(qry.lastError().text())
else:
print("Inserted!" );
qry.prepare("CREATE TABLE IF NOT EXISTS salaries (id INTEGER UNIQUE PRIMARY KEY, annual INTEGER)" );
if(False==qry.exec_()):
print(qry.lastError())
else:
print("Inserted!" );
qry.prepare("INSERT INTO salaries (id, annual) VALUES (1, 1000)" );
if(False==qry.exec_()):
print(qry.lastError())
else:
print("Inserted!" );
qry.prepare("INSERT INTO salaries (id, annual) VALUES (2, 900)" );
if(False==qry.exec_()):
print(qry.lastError())
else:
print("Inserted!" );
qry.prepare("INSERT INTO salaries (id, annual) VALUES (3, 900)" );
if(False==qry.exec_()):
print(qry.lastError())
else:
print("Inserted!" );
qry.prepare("INSERT INTO salaries (id, annual) VALUES (5, 1100)" );
if(False==qry.exec_()):
print(qry.lastError())
else:
print("Inserted!" );
qry.prepare("INSERT INTO salaries (id, annual) VALUES (6, 1000)" );
if(False==qry.exec_()):
print(qry.lastError())
else:
print("Inserted!" );
qry.prepare("INSERT INTO salaries (id, annual) VALUES (8, 1200)" );
if(False==qry.exec_()):
print(qry.lastError())
else:
print("Inserted!" );
qry.prepare("INSERT INTO salaries (id, annual) VALUES (9, 1200)" );
if(False==qry.exec_()):
print(qry.lastError())
else:
print("Inserted!" );
qry.prepare("SELECT * FROM salaries" );
if(False==qry.exec_()):
print(qry.lastError())
else:
print("SelectedFalse==" );# con.close()
# model = QSqlQueryModel();
# model.setQuery( "SELECT firstname, lastname FROM names" );model = QSqlRelationalTableModel()
model.setTable( "names" );
model.setRelation( 0, QSqlRelation( "salaries", "id", "annual" ) );
model.select();
# model.setHeaderData( 0, Qt.Horizontal, ("Annual Pay") );
# model.setHeaderData( 0, Qt.Horizontal, ("Annual Pay") );
# model.setHeaderData( 1, Qt.Horizontal, ("First Name") );
# model.setHeaderData( 2, Qt.Horizontal, ("Last Name") );
## model = QSqlTableModel()
print(model.editStrategy() )
# model.setTable( "names" );
# model.setFilter( "lastname = 'Doe'" );
# model.select();
# model.removeColumn( 0 );
view = QTableView();
view.setModel( model );
view.show();
sys.exit(app.exec_())
содержимое отображается правильно, но после того, как я отредактировал элемент данных и нажал клавишу ввода, произошла эта ошибка:
QSqlQuery::value: not positioned on a valid record
Когда я закрывал приложение и перезапускал его снова, я обнаружил, что редактирование, которое я делал в прошлый раз, не сохранялось в базе данных, каждый может решить мою проблему здесь.
Примечание: я не использовал
model->removeColumn(0)
Вот.
Эти строки являются оскорбительными:
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (:id, :firstname, :lastname)" )
qry.bindValue(":id", 9 );
qry.bindValue(":firstname", "Ralph" );
qry.bindValue(":lastname", "Roe" );
Вы в основном вставляете то же самое, что вставили ранее:
qry.prepare("INSERT INTO names (id, firstname, lastname) VALUES (9, 'Ralph', 'Roe')");
if (qry.exec_() ==False):
print(qry.lastError().text())
else:
print("Inserted!");
Самое интересное дублирование id
здесь, и именно поэтому вы получаете следующую ошибку в командной строке:
UNIQUE constraint failed: names.id Unable to fetch row
По замыслу он отклоняет записи в базе данных с одним и тем же уникальным идентификатором, иначе он уже не будет уникальным, верно?
Разумным решением было бы увеличить идентификатор от 9 до 10 в вашем коде, поскольку вы, кажется, зарезервировали идентификатор от 1 до 9. Как только я внесу изменения в ваш код, он больше не вызывает вышеуказанную ошибку.
Также обратите внимание, что вы вызываете функцию createConnection без указания имени хоста, что приведет к ошибке типа Python, такой как: «TypeError: QSqlDatabase.setHostName (QString): аргумент 1 имеет неожиданный тип« NoneType »».
Вам, вероятно, придется обрабатывать этот сценарий более удобным для пользователя способом.
Других решений пока нет …