sql >> データベース >  >> RDS >> MariaDB

C++プログラムをMariaDBに接続する方法

    本日、MariaDB Connector /C++の一般提供を発表しました。 C ++言語は、その効率性、汎用性、および拡張性で知られています。実際、アプリケーションが予測可能な同時実行性と遅延を必要とするフィンテックやゲームなどの業界でよく使用されます。 MariaDB Connector / C ++を使用すると、開発者はアプリケーション内で新しいコネクタを使用して、オンプレミスのMariaDBサーバーとMariaDBSkySQLのクラウドにネイティブに接続できます。

    この記事では、MariaDBに格納されているデータとの作成、読み取り、更新、削除(CRUD)の相互作用を示す簡単な例を使用して、MariaDB Connector /C++を紹介します。具体的には、タスクを管理するための簡単な操作を実行できるC++コンソールアプリケーションを作成するプロセスについて説明します。しかし、十分に話して、始めましょう!

    ダウンロードとインストール

    MariaDB Connector / C ++を使用するには、MariaDBサーバーのインスタンスにアクセスできる必要があります。ローカルマシン、オンプレミス、さらにはクラウドでMariaDBを使い始めるにはさまざまな方法があります。

    1. MariaDBCommunityServerをダウンロードしてインストールします
      1. 直接
      2. Dockerイメージの使用
    2. MariaDBEnterpriseServerをダウンロードしてインストールします
    3. 究極のMariaDBクラウドデータベースであるMariaDBSkySQLを使用してデプロイする

    MariaDBサーバーインスタンスをセットアップした後、MariaDBコネクタ/ C ++をダウンロードしてインストールする方法については、MariaDBEnterpriseのドキュメントに記載されている手順に従うことができます。

    MariaDBサーバーの準備

    この例では、新しいMariaDB C ++コネクタを使用する前に、データベースとテーブルが必要です。選択したクライアントを使用して、MariaDBデータベースインスタンスに接続し、次のことを行います。

    1.新しいデータベースとタスクレコードの保存を担当する単一のテーブルを作成します。

    CREATE DATABASE IF NOT EXISTS todo;
    
    CREATE TABLE todo.tasks (
      id INT(11) unsigned NOT NULL AUTO_INCREMENT,
      description VARCHAR(500) NOT NULL,
      completed BOOLEAN NOT NULL DEFAULT 0,
      PRIMARY KEY (id)
    );

    2. Connector /C++がMariaDBへの接続に使用する新しいデータベースユーザーを作成します。

    CREATE USER IF NOT EXISTS app_user@localhost IDENTIFIED BY 
     'Password123!';
    
    GRANT ALL PRIVILEGES ON todo.* TO app_user@localhost;
    

    MariaDBサーバーへの接続

    データベースインスタンス、スキーマ、およびユーザーを設定したので、C++にジャンプします。それはすべて、MariaDBへの接続を確立することから始まります。もちろん、これを行うには、C++コードを追加するファイルの先頭にMariaDBコネクタヘッダーファイル、具体的にはconncpp.hppをインクルードする必要があります。

    #include <mariadb/conncpp.hpp>

    接続を確立するには、まずDriverを取得します 次に、Java Database Connectivity(JDBC)構成情報と組み合わせて使用​​して、Connectionを取得できるオブジェクト。 オブジェクト。

    // Instantiate Driver
    sql::Driver* driver = sql::mariadb::get_driver_instance();
    
    // Configure Connection
    sql::SQLString url("jdbc:mariadb://localhost:3306/todo");
    sql::Properties properties({{"user", "app_user"}, {"password", "Password123!"}});
    
    // Establish Connection
    std::unique_ptr<sql::Connection> conn(driver->connect(url, properties));

    MariaDBのConnector/C ++の接続機能の詳細については、公式のエンタープライズドキュメントを確認してください。

    タスクの追加

    Connectionを取得したら オブジェクト、あなたはレースに出かけています! connを使用すると、前のセクションから、プリペアドステートメントを使用してSQLを実行し、MariaDBにデータを挿入できるようになりました。

    // Create a new PreparedStatement
    std::unique_ptr<sql::PreparedStatement> stmnt(conn->prepareStatement("insert into tasks (description) values (?)"));
    
    // Bind values to SQL statement
    stmnt->setString(1, description);
    
    // Execute query
    stmnt->executeQuery();
    を実行します

    タスクの取得

    前のセクションと非常によく似たアプローチを使用して、Statementを作成することもできます。 タスクテーブル内のすべてのタスクレコードを取得して印刷するオブジェクト。

    // Create a new Statement
    std::unique_ptr stmnt(conn->createStatement());
    
    // Execute query
    sql::ResultSet *res = stmnt->executeQuery("select * from tasks");
    
    // Loop through and print results
    while (res->next()) {
           std::cout << "id = " << res->getInt(1);
           std::cout << ", description = " << res->getString(2);
           std::cout << ", completed = " << res->getBoolean(3) << "\n";
    }

    タスクの更新

    PreparedStatementを使用することもできます パラメータ(および値)を指定して、既存のタスクレコードを見つけて変更します。

    // Create a new PreparedStatement
    std::unique_ptr stmnt(conn->prepareStatement("update tasks set completed = ? where id = ?"));
    
    // Bind values to SQL statement
    stmnt->setBoolean(1, completed);
    stmnt->setInt(2, id);
    
    // Execute query
    stmnt->executeQuery();
    を実行します

    タスクの削除

    もちろん、DELETE SQLを使用して、MariaDBからデータを削除することもできます。 PreparedStatementを含むステートメント 、特定のレコードをターゲットにします。

    // Create a new PreparedStatement
    std::unique_ptr stmnt(conn->prepareStatement("delete from tasks where id = ?"));
    
    // Bind values to SQL statement
    stmnt->setInt(1, id);
    
    // Execute query
    stmnt->executeQuery();

    すべてをまとめる

    最後に、以下のコードをコピーして tasks.cpp という新しいファイルに貼り付けることで、すべてを1つの自己完結型の例にまとめることができます。 。以下のサンプルは、私が行ったすべてのCRUD操作を、メインから実行できる関数のコレクションにまとめたものです。 メソッド。

    #include <iostream> 
    #include <cstring>
    #include <mariadb/conncpp.hpp>
    
    // Delete a task record (indicated by id)
    void deleteTask(std::unique_ptr &conn, int id) {
        try {
            // Create a new PreparedStatement
            std::unique_ptr stmnt(conn->prepareStatement("delete from tasks where id = ?"));
            // Bind values to SQL statement
            stmnt->setInt(1, id);
            // Execute query
            stmnt->executeQuery();
        }
        catch(sql::SQLException& e){
          std::cerr << "Error deleting task: " << e.what() << std::endl;
       }
    }
    
    // Update the completed value of a task record (indicated by id)
    void updateTaskStatus(std::unique_ptr &conn, int id, bool completed) {
        try {
            // Create a new PreparedStatement
            std::unique_ptr stmnt(conn->prepareStatement("update tasks set completed = ? where id = ?"));
            // Bind values to SQL statement
            stmnt->setBoolean(1, completed);
            stmnt->setInt(2, id);
            // Execute query
            stmnt->executeQuery();
        }
        catch(sql::SQLException& e){
          std::cerr << "Error updating task status: " << e.what() << std::endl;
       }
    }
    
    // Create a new task record
    void addTask(std::unique_ptr &conn, std::string description) {
        try {
            // Create a new PreparedStatement
            std::unique_ptr stmnt(conn->prepareStatement("insert into tasks (description) values (?)"));
            // Bind values to SQL statement
            stmnt->setString(1, description);
            // Execute query
            stmnt->executeQuery();
        }
        catch(sql::SQLException& e){
          std::cerr << "Error inserting new task: " << e.what() << std::endl;
       }
    }
    
    // Print all records in tasks table 
    void showTasks(std::unique_ptr &conn) {
        try {
            // Create a new Statement
            std::unique_ptr stmnt(conn->createStatement());
            // Execute query
            sql::ResultSet *res = stmnt->executeQuery("select * from tasks");
            // Loop through and print results
            while (res->next()) {
                std::cout << "id = " << res->getInt(1);
                std::cout << ", description = " << res->getString(2);
                std::cout << ", completed = " << res->getBoolean(3) << "\n";
            }
        }
        catch(sql::SQLException& e){
          std::cerr << "Error selecting tasks: " << e.what() << std::endl;
       }
    }
    
    // Main Process
    int main(int argc, char **argv){
        if (argc==1){
            std::cout << "Please provide an argument.\n";
        }
        else {
            try {
                // Instantiate Driver
                sql::Driver* driver = sql::mariadb::get_driver_instance();
    
                // Configure Connection
                sql::SQLString url("jdbc:mariadb://localhost:3306/todo");
                sql::Properties properties({{"user", "app_user"}, {"password", "Password123!"}});
    
                // Establish Connection
                std::unique_ptr conn(driver->connect(url, properties));
    
                // Use arguments to determine execution next steps
                if (!strcmp(argv[1],"showTasks")) {
                    showTasks(conn);
                }
                else if (!strcmp(argv[1],"addTask")) {
                    if (argc != 3) {
                        std::cout << "Invalid arguments";
                        return 1;
                    }
                    addTask(conn, argv[2]);
                }
                else if (!strcmp(argv[1],"updateTaskStatus")) {
                    if (argc != 4) {
                        std::cout << "Invalid arguments";
                        return 1;
                    }
                    updateTaskStatus(conn, atoi(argv[2]), argv[3]);
                }
                else if (!strcmp(argv[1],"deleteTask")) {
                    if (argc != 3) {
                        std::cout << "Invalid arguments"; return 1; } deleteTask(conn, atoi(argv[2])); } // Close Connection conn->close();
            }
            catch(sql::SQLException& e){
                std::cerr << "Error Connecting to MariaDB Platform: " << e.what() << std::endl;
                // Exit (Failed)
                return 1;
            }
        }
    
        // Exit (Success)
        return 0;
    }

    このサンプルアプリケーションの完全なソースは、ここにもあります。このC++の例のソースは、「TODO」と呼ばれるアプリケーションのリポジトリに含まれています。このリポジトリには、Webフロントエンドと多数の言語にまたがる他のいくつかのMariaDBコネクタ統合サンプルアプリケーションも含まれています。

    アプリケーションの実行

    Linux環境内で、 tasks.cppを作成した後 、C ++コンパイラを使用して、タスクと呼ばれる実行可能ファイルを作成できます。

    $ g++ -o tasks tasks.cpp -std=c++11 -lmariadbcpp

    実行可能ファイルを使用して、CRUD操作をテストするためのさまざまな引数値を指定できます。

    • 説明用の値を指定して、新しいタスクレコードを挿入します。
    ./tasks addTask ‘A New Task’
    • すべてのタスクレコードを印刷します。
    ./tasks showTasks
    • タスクレコードの完了値を更新します。 idとcompletedの値を指定するだけです。
    ./tasks updateTaskStatus 1 1
    • id値を指定してタスクレコードを削除します。
    ./tasks deleteTask 1

    ほんの始まり

    うまくいけば、MariaDBでC++の使用を開始するのがいかに簡単であるかを見て楽しんだことでしょう。これはMariaDBを使用したC++プログラミングの優れた入門書ですが、私たちは可能なことのほんの一部を始めたばかりです!

    MariaDB Connector / C ++をさらに深く掘り下げたいですか?新しいC++コネクタの詳細や、その他の多くのMariaDBの機能については、MariaDBDeveloperHubを確認してください。

    MariaDBコネクタ/C++エンタープライズドキュメントを検索します。


    1. MariaDBの数値にパーセント記号を追加する

    2. タイムスタンプを(任意のギャップに基づいて)アイランドにグループ化する方法は?

    3. 主キーを無視してSQLServerの重複行を削除する3つの方法

    4. SQL Server 2016:関係を作成する