PyQt provides a consistent cross-platform API for database access using the QtSql module and PyQt's model/view architecture.* Python also has its own completely different database API, called DB-API, but it isn't needed with PyQt and is not covered here. The commercial edition of Qt comes with many database drivers, whereas the GPL edition has fewer due to licensing restrictions. The drivers that are available include ones for IBM's DB2, Borland's Interbase, MySQL, Oracle, ODBC (for Microsoft SQL Server), PostgreSQL, SQLite, and Sybase. However, like any aspect of PyQt, it is possible to create additional database drivers if one we need is not available.
When Qt is built from source we can configure it to include SQLite, a public domain in-process database. For binary Qt packages, such as the GPL packages for Windows and Mac OS X, SQLite is built-in. The examples in this chapter use SQLite, but apart from the initial connection to the database, and a couple of aspects of raw SQL syntax that we will mention, they should work with any SQL database.
PyQt provides access to databases at two levels. The high level involves using QSqlTableModel or QSqlRelationalTableModel. These models provide abstractions for handling database tables with the same API as the other QAbstractItemModel subclasses, as well as providing some database-specific extensions. The SQL models can be used with views such as QTableView, as we will see in this chapter's last section, or with a QDataWidgetMapper for form views, the topic of this chapter's second section.
The low-level approach, also the most versatile, is based on using QSqlQuery. This class can accept any DDL (data definition language) or DML (data manipulation language) SQL statements and execute them on the database. For example, we can use QSqlQuery to create tables, and to insert, update, and delete records in tables. We will see QSqlQuery in action in this chapter's first section.
★This chapter assumes a knowledge of PyQt's model/view architecture, covered in the preceding chapter, as well as a basic knowledge of SQL.
Was this article helpful?