@probitas/client-sql-mysql
MySQL client for Probitas scenario testing framework.
This package provides a MySQL client designed for integration testing, with transaction support and prepared statement capabilities.
Features
- Query Execution: Parameterized queries with type-safe results
- Transactions: Full transaction support with isolation levels
- Prepared Statements: Automatic parameter escaping and type conversion
- Connection Pooling: Configurable pool with idle timeout
- Resource Management: Implements
AsyncDisposablefor proper cleanup
Installation
deno add jsr:@probitas/client-sql-mysql
Quick Start
import { createMySqlClient } from "@probitas/client-sql-mysql";
const client = await createMySqlClient({
url: {
host: "localhost",
port: 3306,
username: "root",
password: "secret",
database: "mydb",
},
});
// Query with parameters (uses ? placeholders)
const result = await client.query<{ id: number; name: string }>(
"SELECT id, name FROM users WHERE active = ?",
[true]
);
console.log(result.rows);
// Get first row
const user = await client.queryOne<{ id: number; name: string }>(
"SELECT * FROM users WHERE id = ?",
[1]
);
await client.close();
Transactions
import { createMySqlClient } from "@probitas/client-sql-mysql";
import type { SqlTransaction } from "@probitas/client-sql";
const client = await createMySqlClient({ url: "mysql://localhost:3306/testdb" });
await client.transaction(async (tx: SqlTransaction) => {
await tx.query("INSERT INTO accounts (id, balance) VALUES (?, ?)", [1, 100]);
await tx.query("INSERT INTO accounts (id, balance) VALUES (?, ?)", [2, 200]);
// Automatically committed if no error, rolled back on exception
}, { isolationLevel: "serializable" });
await client.close();
Using with using Statement
import { createMySqlClient } from "@probitas/client-sql-mysql";
await using client = await createMySqlClient({
url: { host: "localhost", username: "root", database: "testdb" },
});
const result = await client.query("SELECT 1 as n");
// Client automatically closed when block exits
Related Packages
| Package | Description |
|---|---|
| `@probitas/client-sql` | Common SQL types and utilities |
| `@probitas/client-sql-postgres` | PostgreSQL client |
| `@probitas/client-sql-sqlite` | SQLite client |
| `@probitas/client-sql-duckdb` | DuckDB client |
Links
Installation
deno add jsr:@probitas/client-sql-mysqlClasses
#AccessDeniedError
class AccessDeniedError extends MySqlErrorMySqlErrorError thrown when access is denied (wrong credentials).
Constructor
new AccessDeniedError(message: string, options?: MySqlErrorOptions)Properties
- readonly
namestring - readonly
mysqlKind"access_denied"
#ConnectionRefusedError
class ConnectionRefusedError extends MySqlErrorMySqlErrorError thrown when connection is refused.
Constructor
new ConnectionRefusedError(message: string, options?: MySqlErrorOptions)Properties
- readonly
namestring - readonly
mysqlKind"connection_refused"
#ConstraintError
class ConstraintError extends SqlErrorSqlErrorError thrown when a constraint violation occurs.
| Name | Description |
|---|---|
name | — |
kind | — |
constraint | — |
Constructor
new ConstraintError(
message: string,
constraint: string,
options?: SqlErrorOptions,
)Properties
- readonly
namestring - readonly
kind"constraint" - readonly
constraintstring
#DeadlockError
class DeadlockError extends SqlErrorSqlErrorError thrown when a deadlock is detected.
Constructor
new DeadlockError(message: string, options?: SqlErrorOptions)Properties
- readonly
namestring - readonly
kind"deadlock"
#MySqlError
class MySqlError extends SqlErrorSqlErrorBase error class for MySQL-specific errors. Extends SqlError with MySQL-specific properties like errno.
Constructor
new MySqlError(message: string, options?: MySqlErrorOptions)Properties
- readonly
namestring - readonly
errno?number
#MySqlTransactionImpl
class MySqlTransactionImpl implements MySqlTransactionMySqlTransaction| Name | Description |
|---|---|
begin() | Begin a new transaction. |
query() | — |
queryOne() | — |
commit() | — |
rollback() | — |
savepoint() | — |
rollbackToSavepoint() | — |
releaseSavepoint() | — |
Constructor
new MySqlTransactionImpl(connection: AnyPoolConnection)Methods
static begin(): unknownBegin a new transaction.
query(): unknownqueryOne(): unknowncommit(): unknownrollback(): unknownsavepoint(): unknownrollbackToSavepoint(): unknownreleaseSavepoint(): unknown#QuerySyntaxError
class QuerySyntaxError extends SqlErrorSqlErrorError thrown when a SQL query has syntax errors.
Constructor
new QuerySyntaxError(message: string, options?: SqlErrorOptions)Properties
- readonly
namestring - readonly
kind"query"
#SqlConnectionError
class SqlConnectionError extends SqlErrorSqlErrorError thrown when a connection or network-level error occurs.
This includes:
- Connection refused (server not running)
- Authentication failure
- Connection timeout
- Pool exhaustion
- TLS handshake failure
- DNS resolution failure
Constructor
new SqlConnectionError(message: string, options?: SqlErrorOptions)Properties
- readonly
namestring - readonly
kind"connection"
#SqlError
class SqlError extends ClientErrorClientErrorBase error class for SQL-specific errors. Extends ClientError with SQL-specific properties.
Constructor
new SqlError(message: string, kind: SqlErrorKind, options?: SqlErrorOptions)Properties
- readonly
namestring - readonly
sqlStatestring | null
Interfaces
#MySqlClient
interface MySqlClient extends AsyncDisposableMySQL client interface.
| Name | Description |
|---|---|
config | The client configuration. |
dialect | The SQL dialect identifier. |
query() | Execute a SQL query. |
queryOne() | Execute a query and return the first row or undefined. |
transaction() | Execute a function within a transaction. |
close() | Close the client and release all connections. |
Properties
The client configuration.
- readonly
dialect"mysql"The SQL dialect identifier.
Methods
query<T = Record<string, any>>(
sql: string,
params?: unknown[],
options?: SqlQueryOptions,
): Promise<SqlQueryResult<T>>Execute a SQL query.
Parameters
sqlstring- SQL query string
params?unknown[]- Optional query parameters
options?SqlQueryOptions- Optional query options
queryOne<T = Record<string, any>>(
sql: string,
params?: unknown[],
options?: SqlQueryOptions,
): Promise<T | undefined>Execute a query and return the first row or undefined.
Parameters
sqlstring- SQL query string
params?unknown[]- Optional query parameters
options?SqlQueryOptions- Optional query options
transaction<T>(
fn: (tx: SqlTransaction) => unknown,
options?: SqlTransactionOptions,
): Promise<T>Execute a function within a transaction. Automatically commits on success or rolls back on error.
Parameters
fn(tx: SqlTransaction) => unknown- Function to execute within transaction
options?SqlTransactionOptions- Transaction options
close(): Promise<void>Close the client and release all connections.
#MySqlClientConfig
interface MySqlClientConfig extends CommonOptionsConfiguration for creating a MySQL client.
| Name | Description |
|---|---|
url | Connection URL or configuration. |
pool | Connection pool configuration. |
timezone | Timezone for the connection. |
throwOnError | Whether to throw an error for query failures. |
Properties
Connection URL or configuration.
Can be a connection URL string (e.g., "mysql://user:pass@host:port/database") or a detailed MySqlConnectionConfig object.
Connection pool configuration.
- readonly
timezone?stringTimezone for the connection.
- readonly
throwOnError?booleanWhether to throw an error for query failures. When false, failures are returned as SqlQueryResultError or SqlQueryResultFailure. Can be overridden per-query via SqlQueryOptions.
#MySqlConnectionConfig
interface MySqlConnectionConfig extends CommonConnectionConfigMySQL connection configuration.
Extends CommonConnectionConfig with MySQL-specific options.
Properties
- readonly
database?stringDatabase name to connect to.
TLS configuration.
- readonly
charset?stringCharacter set.
#MySqlErrorOptions
interface MySqlErrorOptions extends SqlErrorOptionsOptions for MySqlError constructor.
| Name | Description |
|---|---|
errno | MySQL error code (e.g., 1045, 1062). |
Properties
- readonly
errno?numberMySQL error code (e.g., 1045, 1062).
#MySqlPoolConfig
interface MySqlPoolConfigConnection pool configuration.
| Name | Description |
|---|---|
connectionLimit | Maximum number of connections in the pool. |
minConnections | Minimum number of idle connections. |
queueLimit | Maximum number of connection requests the pool will queue. |
waitForConnections | Whether to wait for connections to become available. |
idleTimeout | Time in milliseconds before connection is considered idle. |
Properties
- readonly
connectionLimit?numberMaximum number of connections in the pool.
- readonly
minConnections?numberMinimum number of idle connections.
- readonly
queueLimit?numberMaximum number of connection requests the pool will queue.
- readonly
waitForConnections?booleanWhether to wait for connections to become available.
- readonly
idleTimeout?numberTime in milliseconds before connection is considered idle.
#MySqlTlsConfig
interface MySqlTlsConfigTLS/SSL configuration for MySQL connections.
| Name | Description |
|---|---|
ca | Root CA certificate (PEM format). |
cert | Client certificate (PEM format). |
key | Client private key (PEM format). |
rejectUnauthorized | Skip server certificate verification (use only for testing). |
Properties
- readonly
ca?stringRoot CA certificate (PEM format).
- readonly
cert?stringClient certificate (PEM format).
- readonly
key?stringClient private key (PEM format).
#MySqlTransaction
interface MySqlTransaction extends SqlTransactionMySQL-specific transaction interface. Extends SqlTransaction with MySQL-specific features.
| Name | Description |
|---|---|
savepoint() | Create a savepoint. |
rollbackToSavepoint() | Rollback to a savepoint. |
releaseSavepoint() | Release a savepoint. |
Methods
savepoint(name: string): Promise<void>Create a savepoint.
Parameters
namestring- Savepoint name
rollbackToSavepoint(name: string): Promise<void>Rollback to a savepoint.
Parameters
namestring- Savepoint name
releaseSavepoint(name: string): Promise<void>Release a savepoint.
Parameters
namestring- Savepoint name
#SqlErrorOptions
interface SqlErrorOptions extends ErrorOptionsOptions for SqlError constructor.
| Name | Description |
|---|---|
sqlState | SQL State code (e.g., "23505" for unique violation) |
Properties
- readonly
sqlState?stringSQL State code (e.g., "23505" for unique violation)
#SqlQueryOptions
interface SqlQueryOptions extends CommonOptionsOptions for individual SQL queries.
| Name | Description |
|---|---|
throwOnError | Whether to throw an error for query failures. |
Properties
- readonly
throwOnError?booleanWhether to throw an error for query failures. When false, failures are returned as SqlQueryResultError or SqlQueryResultFailure.
#SqlQueryResultError
interface SqlQueryResultError<T = any> extends SqlQueryResultBase<T>SQL query result for query errors (syntax errors, constraint violations, etc.).
Server received and processed the query, but it failed due to a SQL error.
| Name | Description |
|---|---|
processed | Server processed the query. |
ok | Query failed. |
error | Error describing the SQL error. |
rows | Empty rows for failed queries. |
rowCount | Zero affected rows for failed queries. |
lastInsertId | No lastInsertId for failed queries. |
warnings | No warnings for failed queries. |
Properties
- readonly
processedtrueServer processed the query.
- readonly
okfalseQuery failed.
Error describing the SQL error.
- readonly
rowsreadonly never[]Empty rows for failed queries.
- readonly
rowCount0Zero affected rows for failed queries.
- readonly
lastInsertIdnullNo lastInsertId for failed queries.
- readonly
warningsnullNo warnings for failed queries.
#SqlQueryResultFailure
interface SqlQueryResultFailure<T = any> extends SqlQueryResultBase<T>SQL query result for connection failures (network errors, timeouts, etc.).
Query could not be processed by the server (connection refused, timeout, pool exhausted, authentication failure, etc.).
| Name | Description |
|---|---|
processed | Server did not process the query. |
ok | Query failed. |
error | Error describing the failure. |
rows | No rows (query didn't reach server). |
rowCount | No row count (query didn't reach server). |
lastInsertId | No lastInsertId (query didn't reach server). |
warnings | No warnings (query didn't reach server). |
Properties
- readonly
processedfalseServer did not process the query.
- readonly
okfalseQuery failed.
Error describing the failure.
- readonly
rowsnullNo rows (query didn't reach server).
- readonly
rowCountnullNo row count (query didn't reach server).
- readonly
lastInsertIdnullNo lastInsertId (query didn't reach server).
- readonly
warningsnullNo warnings (query didn't reach server).
#SqlQueryResultSuccess
interface SqlQueryResultSuccess<T = any> extends SqlQueryResultBase<T>SQL query result for successful queries.
The query was executed successfully and returned results.
| Name | Description |
|---|---|
processed | Server processed the query. |
ok | Query succeeded. |
error | No error for successful queries. |
rows | Query result rows. |
rowCount | Number of affected rows. |
lastInsertId | Last inserted ID (for INSERT statements). |
warnings | Warning messages from the database. |
Properties
- readonly
processedtrueServer processed the query.
- readonly
oktrueQuery succeeded.
- readonly
errornullNo error for successful queries.
- readonly
rowsreadonly T[]Query result rows.
- readonly
rowCountnumberNumber of affected rows.
- readonly
lastInsertIdbigint | string | nullLast inserted ID (for INSERT statements).
- readonly
warningsunknown | nullWarning messages from the database.
#SqlQueryResultSuccessParams
interface SqlQueryResultSuccessParams<T = any>Parameters for creating a SqlQueryResultSuccess.
| Name | Description |
|---|---|
rows | The result rows |
rowCount | Number of affected rows (for INSERT/UPDATE/DELETE) |
duration | Query execution duration in milliseconds |
lastInsertId | Last inserted ID (for INSERT statements) |
warnings | Warning messages from the database |
Properties
- readonly
rowsreadonly T[]The result rows
- readonly
rowCountnumberNumber of affected rows (for INSERT/UPDATE/DELETE)
- readonly
durationnumberQuery execution duration in milliseconds
- readonly
lastInsertId?bigint | stringLast inserted ID (for INSERT statements)
- readonly
warnings?readonly string[]Warning messages from the database
#SqlTransaction
interface SqlTransactionSQL transaction interface. Implementations should provide actual database-specific transaction handling.
| Name | Description |
|---|---|
query() | Execute a query within the transaction. |
queryOne() | Execute a query and return the first row or undefined. |
commit() | Commit the transaction. |
rollback() | Rollback the transaction. |
Methods
query<T = Record<string, any>>(
sql: string,
params?: unknown[],
options?: SqlQueryOptions,
): Promise<SqlQueryResult<T>>Execute a query within the transaction.
Parameters
sqlstring- SQL query string
params?unknown[]- Optional query parameters
options?SqlQueryOptions- Optional query options
queryOne<T = Record<string, any>>(
sql: string,
params?: unknown[],
options?: SqlQueryOptions,
): Promise<T | undefined>Execute a query and return the first row or undefined.
Parameters
sqlstring- SQL query string
params?unknown[]- Optional query parameters
options?SqlQueryOptions- Optional query options
commit(): Promise<void>Commit the transaction.
rollback(): Promise<void>Rollback the transaction.
#SqlTransactionOptions
interface SqlTransactionOptionsOptions for starting a transaction.
| Name | Description |
|---|---|
isolationLevel | Isolation level for the transaction |
Properties
Isolation level for the transaction
Functions
#convertMySqlError
function convertMySqlError(error: unknown): SqlErrorConvert a mysql2 error to the appropriate error class.
Parameters
errorunknown
#createMySqlClient
async function createMySqlClient(
config: MySqlClientConfig,
): Promise<MySqlClient>Create a new MySQL client instance with connection pooling.
The client provides connection pooling, parameterized queries, transaction support, and automatic result type mapping.
Parameters
configMySqlClientConfig- MySQL client configuration
Returns
Promise<MySqlClient> — A promise resolving to a new MySQL client instance
Examples
Using URL string
import { createMySqlClient } from "@probitas/client-sql-mysql";
const client = await createMySqlClient({
url: "mysql://user:password@localhost:3306/testdb",
});
const result = await client.query<{ id: number; name: string }>(
"SELECT * FROM users WHERE id = ?",
[1],
);
if (result.ok) {
console.log(result.rows[0]); // { id: 1, name: "Alice" }
}
await client.close();
Using connection config object
import { createMySqlClient } from "@probitas/client-sql-mysql";
const client = await createMySqlClient({
url: {
host: "localhost",
port: 3306,
username: "root",
password: "password",
database: "testdb",
},
pool: { connectionLimit: 20 },
});
await client.close();
Transaction with auto-commit/rollback
import { createMySqlClient } from "@probitas/client-sql-mysql";
import type { SqlTransaction } from "@probitas/client-sql";
const client = await createMySqlClient({ url: "mysql://localhost:3306/testdb" });
const user = await client.transaction(async (tx: SqlTransaction) => {
await tx.query("INSERT INTO users (name) VALUES (?)", ["Alice"]);
return await tx.queryOne("SELECT LAST_INSERT_ID() as id");
});
await client.close();
Using await using for automatic cleanup
import { createMySqlClient } from "@probitas/client-sql-mysql";
await using client = await createMySqlClient({
url: "mysql://localhost:3306/testdb",
});
const result = await client.query("SELECT 1");
// Client automatically closed when scope exits
#isConnectionError
function isConnectionError(error: unknown): booleanCheck if an error is a connection-level error.
Parameters
errorunknown
Types
#MySqlErrorKind
type MySqlErrorKind = "access_denied" | "connection_refused"MySQL-specific error kinds.
#SqlErrorKind
type SqlErrorKind = "query" | "constraint" | "deadlock" | "connection" | "unknown"SQL-specific error kinds.
#SqlFailureError
type SqlFailureError = SqlConnectionError | AbortError | TimeoutErrorError types that indicate the operation was not processed. These are errors that occur before the query reaches the SQL server.
#SqlIsolationLevel
type SqlIsolationLevel = "read_uncommitted" | "read_committed" | "repeatable_read" | "serializable"Transaction isolation level.
#SqlOperationError
type SqlOperationError = QuerySyntaxError | ConstraintError | DeadlockError | SqlErrorError types that indicate an operation was processed by the server. These errors occur after the query reaches the SQL server.
#SqlQueryResult
type SqlQueryResult<T = any> = SqlQueryResultSuccess<T> | SqlQueryResultError<T> | SqlQueryResultFailure<T>SQL query result union type representing all possible result states.
- Success:
processed: true, ok: true, error: null - Error:
processed: true, ok: false, error: SqlError - Failure:
processed: false, ok: false, error: SqlConnectionError
