Qt データベース開発に関するちょっとした知識

  • Qt はライブラリ形式でのデータベースとの直接通信だけでなく、ODBC データソース形式でのさまざまなデータベースとの通信もサポートしており、あらゆる状況をカバーします。

  • Qt データベース プログラムがパッケージ化されリリースされています。すべての前提条件: 32/64 ビットの区別に注意してください。プログラムが 32 ビットの場合は、32 ビットのライブラリを持参する必要があります。プログラムが 64 ビットの場合は、64 ビットのライブラリを持参する必要があります。 -bit ライブラリこれは Qt ライブラリにも当てはまります。mysql を公開するのが最も簡単です。mysql ダイナミック ライブラリ ファイル (Windows では libmysql.dll) を持参するだけです。非常に簡単です。sqlserver は Microsoft の子孫であり、通常はオペレーティング システムに含まれているため、使用する必要はありません。Postgres で必要なのは、ファイル libpq.dll、libintl-8.dll、libiconv-2.dll、libeay32.dll、および ssleay32.dll のみです。Oracle は oci.dll と oraociei11.dll を導入する必要があります (このファイルは 130MB 以上と非常に大きいです)。これが機能しない場合は、Oracle クライアント ソフトウェアを直接インストールし、bin ディレクトリに対応する環境変数を設定することをお勧めします。

  • パッケージ化してリリース後にテストした結果、32ビットプログラムは64ビットmysqlにも正常に接続でき、64ビットプログラムも32ビットmysqlに正常に接続できることがわかりました。プログラムのライブラリのビット数 (コンパイル時) これも規則です。32 ビット Qt プログラムは、データベース プラグインのコンパイル時に 32 ビット データベース リンク ライブラリも使用する必要があります。) 桁数と一致している必要はありません。 mysql、sqlserver、postgresql データベースを同様のルールでテストしました。

  • 多数のテストを比較した結果、odbc データ ソース方式とデータベースへの直接接続方式で大量のデータ レコードをバッチで挿入します。直接接続方式の方が約 5% 高速であるため、使用することをお勧めします。 odbc データソースを使用する場合、Qt にはデフォルトで odbc データベースプラグインが付属しています。

  • 異なるデータベースが SQL スクリプトを実行すると、テーブル名またはフィールド名が大文字または小文字に自動的に変換されます。MySQL はテーブル名を小文字に変換し、PostgreSQL はテーブル名とフィールド名を小文字に変換し、Oracle はテーブル名とフィールド名を小文字に変換します。小文字。大文字に変換します。これは、QSqlTableModel を使用して setTable を呼び出してデータベース テーブル名を設定する場合、データベース内のテーブル名と一致しており、大文字と小文字が区別される必要があるという事実につながります。この巨大なたわごとの盆地は Qt のバグのせいにしたいくらいです。

void DbHelper::bindTable(const QString &dbType, QSqlTableModel *model, const QString &table)
{
    
    
    //postgresql全部小写,oracle全部大写,这两个数据库严格区分表名字段名的大小写卧槽
    QString flag = dbType.toUpper();
    if (flag == "POSTGRESQL") {
    
    
        model->setTable(table.toLower());
    } else if (flag == "ORACLE") {
    
    
        model->setTable(table.toUpper());
    } else {
    
    
        model->setTable(table);
    }
}
  • Qt はデータベース名を指定せずにデータベースを開くことをサポートしています。これは、データベース サーバーに接続した後にデータベースを作成するために SQL ステートメントを実行する必要がある場合があるためです。データベースがまだ存在しない場合に接続するにはどうすればよいですか? テストの結果、sqlite、mysql、sqlserver、および postgresql がすべてこの機能をサポートしていることがわかりました。データベースの削除と作成の前提条件は、データベースが他のプログラムによって占有されていないことです。たとえば、他のプログラムがデータベースを開いている場合、実行は失敗します。私はここで何度も拷問を受けてきましたが、なぜ処刑が失敗するのでしょうか?後で、サードパーティのデータベース ツールがすでにデータベースを開いていることがわかったので、ツールをオフにしましたが、問題はありませんでした。
QSqlDatabase database = QSqlDatabase::addDatabase("QMYSQL");
//database.setDatabaseName("dbtool");
database.setHostName("127.0.0.1");
database.setPort(3306);
database.setUserName("root");
database.setPassword("root");

if (database.open()) {
    
    
    QSqlQuery query(database);
    qDebug() << "删除数据库" << query.exec("drop database dbtool");
    qDebug() << "创建数据库" << query.exec("create database dbtool");
    if (query.exec("select * from userinfo")) {
    
    
        while (query.next()) {
    
    
            qDebug() << "查询数据库" << query.value(0);
        }
    }
} else {
    
    
     qDebug() << "打开数据库" << database.lastError().text();
}
  • QSqlQueryModel+QTableViewを使用してデータを表示します。int型データが100万を超えると科学表記法で表示されます。これは非常に面倒であり、意図した結果ではありません。インターネット中を探し回った結果、同じ問題を抱えている友人を見つけました。彼はこのコラムに空のコミッションを追加するだけでした。その後、空の委任では不十分で、1,000 万を超えると機能しなくなり、データ モデルを再読み込みして表示するという究極の方法が必要であることがわかりました。
ui->tableView->setItemDelegateForColumn(0, new QItemDelegate);

//下面是终极大法
QVariant SqlQueryModel::data(const QModelIndex &index, int role) const
{
    
    
    QVariant value = QSqlQueryModel::data(index, role);
    //超过100万的数值会被科学计数显示需要这里转成字符串显示
    if (role == Qt::DisplayRole) {
    
    
        int result = value.toInt();
        if (result >= 1000000) {
    
    
            value = QString::number(result);
        }
    }
    return value
}
  • mysql データベースには複数のデータベース エンジンがあります。その中で、MyIsam はデータベース トランザクションをサポートしていません。通常、デフォルトはこのエンジンです。そのため、Qt でトランザクション メソッドを使用してコミットすると、失敗することがわかります。実際、成功しました。データベースに移動します。内部でチェックされた対応する結果は再び正しいです。方法は2つあり、1つ目はデータベースエンジンをInnoDBに変更する方法、2つ目はサブミット後にエラー判定する if (database.commit() || !database.lastError().isValid())です。利用できません。説明は成功しました。

  • odbc データ ソース通信を使用する場合は、データベース名 setDatabaseName、ユーザー名 setUserName、およびユーザー パスワード setPassword を設定するだけで済みます。これは、対応するホスト アドレスとポート、および関連するデータベース名が設定されるためです。 odbc データ ソースと通信する場合は、ユーザー情報を再度確認するだけで済みます。ここで特に注意が必要なのは、setDatabaseName でデータベース名を設定するときに、データ ソース構成の名前を入力する必要があることです。

  • 挿入、削除、バッチ、クエリ、ページングなどの操作、数千万件のデータを含む多数の比較テストを行った結果、Qt データベース部分の応答速度の観点から、フレンドリー ランキングは sqlite > postgresql > oracle > となりました。 mysql > odbc。数千万以上の順序は、postgresql > oracle > mysql > sqlite > odbc です。1 億レベルを超えると、oracle > postgresql > その他になります。上記のテストはすべて初級レベルのものであり、サブデータベースやサブテーブル、結合クエリ、キャッシュ、インメモリデータベースなどの各種高度な知識については使用しておりません。

  • mysql には、mysql5.7 と mysql8 の 2 つの主要なバージョンがあります。公式には、8 の方が 5 よりもはるかに高速です。個人的にテストした結果、バッチでのデータのクエリや挿入の場合でも、5.7 の方が 8 よりもはるかに高速です。理由はわかりません。とネットで調べましたが、これも結果です(https://www.coder4.com/archives/7596) 皆さん、8のほうが遅いと言っています。

  • mysql には mariadb と呼ばれるブランチがあり、mysql よりも純粋です。mysql はあらゆる面で尊重されていると言われています。個人的な比較テストによると、バッチ挿入とクエリのパフォーマンスがはるかに優れており、mysql と完全な互換性があります。ライブラリ ファイルの名前を変更すると、直接使用できるようになります。たとえば、libmariadb.dll を libmysql.dll に変更すると、直接使用でき、サイズが 8 分の 1 に小さくなります。これは良いことです。リリースされたときは数メガバイト小さくなっていました。 。

  • Qt+mysql プログラムの場合、リリース時のライブラリのバージョンは、プラグインに対応するデータベースのバージョンと一致している必要があります。そうでない場合は、データベース トランザクション機能がなく、database.driver()->hasFeature(QSqlDriver::トランザクション) は false です。

  • QSqlTableModel は非常によくカプセル化されています。すべてのデータを一度にロードするのではなく、スクロール バーを引くと必要なデータをロードします。1 億のエントリを持つテーブルをテストする場合、速度は非常に高速です。数千のエントリを持つテーブルの速度。

  • ネットワーク データベースに接続するとき、ローカル ネットワークにプロキシがある場合 (github などの Web サイトにアクセスするためにプロキシを使用する場合など)、Qt データベース プログラムが接続できないことがわかります。QNetworkProxyFactory::setUseSystemConfiguration(false ) を設定する必要があります。ここで注意しないと、問題が発生し、自分の人生に疑問を抱くことになります。


Lingsheng Academy のプロジェクト クラスをお勧めします。個人的には先生の教え方が上手だったと思います。共有したいと思います:
Lingsheng Platinum Learning Card (インフラストラクチャ/高性能ストレージ/golang クラウド ネイティブ/オーディオとビデオ/Linux カーネルを含む)
https://xxetb.xet .tech/s/VsFMs

おすすめ

転載: blog.csdn.net/qq_40135848/article/details/132948043