knex_dart

A faithful port of Knex.js to Dart — a powerful, fluent SQL query builder for Dart backends.

Pub Version codecov License: MIT

Packages

Package Description Version
knex_dart Core query builder (this package) pub
knex_dart_postgres PostgreSQL driver pub
knex_dart_mysql MySQL driver pub
knex_dart_sqlite SQLite driver pub

knex_dart is the core package — it contains the query builder, schema builder, and compiler logic but no database connectivity. Pick the driver package for your database.

Installation

dependencies:
  knex_dart_postgres: ^0.1.0  # or mysql / sqlite

The driver package pulls in knex_dart automatically.

Quick Start

PostgreSQL

import 'package:knex_dart_postgres/knex_dart_postgres.dart';

final db = await KnexPostgres.connect(
  host: 'localhost',
  database: 'mydb',
  username: 'user',
  password: 'pass',
);

final users = await db.select(
  db('users').where('active', '=', true).limit(10),
);

await db.destroy();

SQLite

import 'package:knex_dart_sqlite/knex_dart_sqlite.dart';

final db = await KnexSQLite.connect(filename: ':memory:');

await db.executeSchema(
  db.schema.createTable('users', (t) {
    t.increments('id');
    t.string('name');
  }),
);

await db.insert(db('users').insert({'name': 'Alice'}));

MySQL

import 'package:knex_dart_mysql/knex_dart_mysql.dart';

final db = await KnexMySQL.connect(
  host: 'localhost',
  database: 'mydb',
  user: 'user',
  password: 'pass',
);

Query Builder

All driver packages expose the same Knex query builder API.

SELECT

// Basic
db('users').select(['id', 'name']).where('active', '=', true);

// Joins
db('users')
  .join('orders', 'users.id', '=', 'orders.user_id')
  .select(['users.name', 'orders.total'])
  .where('orders.status', '=', 'completed');

// Aggregates
db('sales')
  .count('* as total')
  .sum('amount as revenue')
  .where('status', '=', 'completed');

INSERT / UPDATE / DELETE

db('users').insert({'name': 'Alice', 'email': 'alice@example.com'});

db('users').where('id', '=', 1).update({'name': 'Bob'});

db('users').where('id', '=', 1).delete();

Advanced

// CTEs
db('active_users')
  .withRecursive('active_users', db('users').where('active', '=', true))
  .select(['*']);

// Upsert
db('users')
  .insert({'email': 'alice@example.com', 'name': 'Alice'})
  .onConflict('email')
  .merge();

// Raw
db.raw('select * from users where id = ?', [1]);

Schema Builder

await db.executeSchema(
  db.schema.createTable('posts', (t) {
    t.increments('id');
    t.string('title').notNullable();
    t.text('body');
    t.integer('user_id').references('id').inTable('users');
    t.timestamps();
  }),
);

Transactions

await db.trx((trx) async {
  await trx.insert(trx('accounts').insert({'balance': 100}));
  await trx.update(trx('accounts').where('id', '=', 1).update({'balance': 0}));
});

Side-by-Side: Knex.js vs knex_dart

Knex.js

knex('users')
  .select('name', 'email')
  .where('age', '>', 18)
  .orderBy('created_at', 'desc')
  .limit(10);

knex_dart

db('users')
  .select(['name', 'email'])
  .where('age', '>', 18)
  .orderBy('created_at', 'desc')
  .limit(10);

Features

  • SELECT, INSERT, UPDATE, DELETE
  • WHERE — basic, IN, NULL, BETWEEN, EXISTS, OR, raw
  • JOINs — INNER, LEFT, RIGHT, FULL OUTER, CROSS, with callback builder
  • Aggregates — COUNT, SUM, AVG, MIN, MAX with DISTINCT variants
  • ORDER BY, GROUP BY, HAVING, LIMIT, OFFSET
  • Raw queries with ?, :name, ?? binding formats
  • RETURNING clause (PostgreSQL)
  • CTEs (WITH / WITH RECURSIVE)
  • UNIONs, INTERSECTs, EXCEPTs
  • Subqueries
  • JSON operators (whereJsonPath, whereJsonSupersetOf, etc.)
  • Full-text search (whereFullText)
  • Upserts (onConflict().merge())
  • Schema builder — createTable, alterTable, dropTable, foreign keys, indexes
  • Dialect-aware SQL (PostgreSQL $1, MySQL/SQLite ?)

Acknowledgments

This project is a port of Knex.js, created by Tim Griesser and contributors.

License

MIT — see LICENSE.

Libraries

knex
Knex Dart - SQL Query Builder
knex_dart
Knex Dart - SQL Query Builder