Native MySQL client written in Dart for Dart

See example directory for examples and usage

Roadmap

  • Auth with mysql_native_password
  • Basic connection
  • Connection pool
  • Query placeholders
  • Transactions
  • Prepared statements (real, not emulated)
  • SSL connection
  • Auth using caching_sha2_password (default since MySQL 8)
  • Send data in binary form when using prepared stmts (do not convert all into strings)
  • Multiple resul sets

Usage

Create connection pool

final pool = MySQLConnectionPool(
    host: '127.0.0.1',
    port: 3306,
    userName: 'your_user',
    password: 'your_password',
    maxConnections: 10,
    databaseName: 'your_database_name', // optional,
  );

Query database

var result = await pool.execute("SELECT * FROM book WHERE id = :id", {"id": 1});

Print result

  for (final row in result.rows) {
    print(row.assoc());
  }

Prepared statements

This library supports real prepared statements (using binary protocol).

Prepare statement

var stmt = await conn.prepare(
  "INSERT INTO book (author_id, title, price, created_at) VALUES (?, ?, ?, ?)",
);

Execute with params

await stmt.execute([null, 'Some book 1', 120, '2022-01-01']);
await stmt.execute([null, 'Some book 2', 10, '2022-01-01']);

Deallocate prepared statement

await stmt.deallocate();

Transactions

To execute queries in transaction, you can use transactional() method on connection or pool object
Example:

await pool.transactional((conn) async {
  await conn.execute("UPDATE book SET price = :price", {"price": 300});
  await conn.execute("UPDATE book_author SET name = :name", {"name": "John Doe"});
});

In case of exception, transaction will roll back automatically.

Tests

To run tests execute

dart test

GitHub

View Github