UUID、主キー、データベースについて

この記事では、データベースを操作するためのQtドライバーの代替バージョンについて説明します。概して、ネイティブQtドライバーとの違いはそれほど多くなく、ほんの2、3です。1)UUIDタイプのサポート。2)独立したオブジェクトと同様に、エンティティ「トランザクション」を操作します。しかし、これらの違いにより、元のQtソリューションのコード実装が大幅に改訂され、動作するコードを作成する方法が変わりました。





主キー:UUIDまたは整数?

私は、イルカのチームで働いているときに、2003年にUUIDを主キーとして使用するというアイデアに最初に精通しました。私たちは、生産における技術プロセスの自動化のためのプログラムを開発しました。DBMSはプロジェクトで重要な役割を果たしました。当時はFireBirdバージョン1.5でした。プロジェクトがより複雑になるにつれて、主キーとして整数識別子を使用することが困難になりました。いくつかの問題について説明します。





  • アーキテクチャ上の問題:顧客は、新しいバージョンの配布キットに含めるために、参照データを送信することがありました。ディレクトリには、データベースにすでに存在する主キーが含まれている場合があります。データ集約の過程で衝突を排除しなければなりませんでした。問題はそれだけではありませんでした。新しい配布キットを展開するときに、逆衝突が定期的に発生しました。





  • : SELECT-, ( ). . . , , 2003 , - - .





UUID- , . UUID- , , SELECT- , . FireBird 1.5 UUID-, 32 ( UUID- ). , .





UUID- : 1) ; 2) . , . , , UUID-.





: UUID vs Integer MS SQL " – GUID ?"





FireBird

2012 FireBird. . QtFramework. FireBird 2.5 UUID-. : " Qt- FireBird QUuid?" Qt- UUID-. , , .





""

Qt- FireBird 2018 . . - , , ́ . . FireBird, . PostgreSQL, .





. Qt-FireBird . , Qt-, , : ( ) ( "" Driver). Qt- . , , : ( - ). Oracle, PostgreSQL, MS SQL ODBC. FireBird , API . , Qt-FireBird .





(2-3) , . . . , : , , , , sql- , . , . " - ". sql- .





"", , , . , "" , . , "" , , . , COMMIT ROLLBACK. , . Qt-.





, . (Driver) . , , . .





Qt-, :





- : " ?! ' - ', !" , , , , "" ODBC . , - , .





void function3(int value3)
{
    db::firebird::Driver::Ptr dbcon = fbpool().connect();
    db::firebird::Transaction::Ptr transact3 = dbcon->createTransact();
    QSqlQuery q3 {db::firebird::createResult(transact3)};

    if (!transact3->begin())
        return;
        
    if (!q3.prepare("INSERT INTO TABLE3 (VALUE3) VALUES (:VALUE3)"))
        return;
        
    sql::bindValue(q3, ":VALUE3" , value3);
    
    if (!q3.exec())
         return;

    transact3->commit();
}

void function2(int value2)
{
    db::firebird::Driver::Ptr dbcon = fbpool().connect();
    db::firebird::Transaction::Ptr transact2 = dbcon->createTransact();
    QSqlQuery q2 {db::firebird::createResult(transact2)};

    if (!transact2->begin())
        return;

    if (!q2.prepare("SELECT * FROM TABLE2 WHERE VALUE2 = :VALUE2"))
        return;
        
     sql::bindValue(q2, ":VALUE2 " , value2);
     
     if (!q2.exec())
         return;
         
    while (q2.next())
    {
        qint32 value3;
        sql::assignValue(value3, q2.record(), "VALUE3");
        function3(value3);
    }
}

void function1()
{
    db::firebird::Driver::Ptr dbcon = db::firebird::pool().connect();
    db::firebird::Transaction::Ptr transact1 = dbcon->createTransact();
    QSqlQuery q1 {db::firebird::createResult(transact1)};
    
    if (!transact1->begin())
        return;
        
    if (!sql::exec(q1, "SELECT * FROM TABLE1"))
        return;
        
    while (q1.next())
    {
        QSqlRecord r = q1.record();
        QUuidEx  id;
        qint32   value1;
        qint32   value2;
        sql::assignValue(id     , r, "ID     ");
        sql::assignValue(value1 , r, "VALUE1 ");
        sql::assignValue(value2 , r, "VALUE2 ");
        ...
        function2(value2);
    }
}
      
      



(1-3) . . QSqlQuery. ROLLBACK- SELECT- COMMIT- .





sql-. .





void function3(db::firebird::Transaction::Ptr transact, int value3)
{
    QSqlQuery q3 {db::firebird::createResult(transact)};
    //  - 
}

void function2(db::firebird::Transaction::Ptr transact, int value2)
{
    QSqlQuery q2 {db::firebird::createResult(transact)};
    //  - 
    function3(transact, value3);
}

void function1()
{
    db::firebird::Driver::Ptr dbcon = db::firebird::pool().connect();
    db::firebird::Transaction::Ptr transact = dbcon->createTransact();
    QSqlQuery q1 {db::firebird::createResult(transact)};
    
    if (!transact->begin())
        return;
        
    while (q1.next())
    {
        //  - 
        function2(transact, value2);
    }
    transact->commit();
}
      
      



PostgreSQL

2020 . : PostgreSQL. 18- , . PostgreSQL FireBird. Qt, , . Qt- : PREPARE EXECUTE. , , . , " ", PostgreSQL API. libpqxx , . " ". , . , . , , PostgreSQL . , . . singleConnect()



, . . singleConnect()



FALSE



. , . . , . .





MS SQL

MS SQL. , . MS SQL ODBC. PostgreSQL: - . , OLE DB MS SQL , ODBC . , "" . , NULL-. , .





Driver

Qt-. :





  • beginTransaction();





  • commitTransaction();





  • rollbackTransaction().





"" Qt-.





, , , . :





  • tables();





  • record();





  • primaryIndex();





  • formatValue();





  • escapeIdentifier().





. , , . , , .





, : "Forward Only". , , . , , SqlCachedResult



. - Qt-.





Driver



abortOperation()



, sql-, "" . Result



size2()



, sql-. size2()



, resultSize(const QSqlQuery&)



. .





GPL/LGPL 2.1. SqlCachedResult



, Qt . . PostgreSQL, , ( ). , : LGPL. , .





ALog, SharedTools.





-

. : FireBird, PostgreSQL, MS SQL. , . SharedTools .





QtCreator, QBS. :





  1. db_demo_project.qbs - ( 2-4);





  2. db_demo_firebird.qbs - FireBird ( FireBird-);





  3. db_demo_postgres.qbs - PostgreSQL ( libpq-dev);





  4. db_demo_mssql.qbs - MS SQL.





Linux, . Windows FireBird- (), .





- :





  • /tmp/db-demo-firebird.log





  • /tmp/db-demo-mssql.log





  • /tmp/db-demo-postgres.log





, . , - .





, , , : ", , . ?!" , !





私の仕事や同僚の仕事の多くはドライバーの作成に投資されており、多くの人生が費やされてきました。プログラマーが外部の依存関係を嫌うことを知っているので、提示されたソリューションが「現状のまま」使用されるという幻想はありません。誰かが「ホットアイアンで燃え尽きる」ALogを自分のものに置き換えることを決定したことを認めます-私は気にしません(私は他のロガーと一緒にこれを行います;)いずれにせよ、私たちのソリューションが誰かの時間を節約するかどうか、または新しいアイデアの出発点として機能します-それは良いことです!








All Articles