Native MySQL client written in Dart for Dart

See example directory for examples and usage


  • 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


Create connection pool

final pool = MySQLConnectionPool(
    host: '',
    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) {

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();


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

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.


To run tests execute

dart test


View Github