塩焼きブログ

塩焼きに関しての研究内容を公開しています

RustのMySQLでparams!を使おうとしてcannot find macro `params!` in this scopeと言われたら

下記のようなコードを書いたら上手く動かない。

#[macro_use]
use mysql;

fn main() {
    let pool = mysql::Pool::new("mysql://user:pass@host:3306/dbname").unwrap();
    let mut stmt = pool.prepare(r"SELECT name FROM user WHERE user = :user AND pass = :pass").unwrap();
    let test = stmt.execute( mysql::params! { "user" => &user, "pass" => &pass, });
    // ..
}

マクロが存在しないため下記のようなエラーが出る。

error: cannot find macro `params!` in this scope
   --> src/server.rs:511:23
    |
200 |             .execute( mysql::params! { user => &user, pass => &pass, })
    |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

useする際に、マクロも一緒に読み込むことで使えるようになった。

#[macro_use]
use mysql::{params};

fn main() {
    let pool = mysql::Pool::new("mysql://user:pass@host:3306/dbname").unwrap();
    let mut stmt = pool.prepare(r"SELECT name FROM user WHERE user = :user AND pass = :pass").unwrap();
    let test = stmt.execute( mysql::params! { "user" => &user, "pass" => &pass, });
    // ..
}

SQLを書く時は名前付きのプレースホルダを使うようにしている。?だと可読性が悪いかなと思って。