mysql2 Compatibility for Node.js SDK
mysql2 Compatibility for Node.js SDK
Section titled “mysql2 Compatibility for Node.js SDK”This document describes the mysql2-compatible interface for the WorkerSQL Node.js SDK, enabling drop-in replacement for TypeORM, Sequelize, Knex, and other Node.js ORMs.
Overview
Section titled “Overview”The WorkerSQL Node.js SDK now includes a mysql2-compatible interface:
- Module:
@workersql/node-sdk/mysql2-compat
- Compatible with: mysql2/promise API
- Features: Connection pooling, prepared statements, transactions
Installation
Section titled “Installation”import { createConnection, createPool } from '@workersql/node-sdk/mysql2-compat';
// Create single connectionconst connection = createConnection({ host: 'api.workersql.com', user: 'myuser', password: 'mypass', database: 'mydb', apiKey: 'your-api-key'});
// Or use DSNconst connection = createConnection({});
Usage with TypeORM
Section titled “Usage with TypeORM”Update ormconfig.json
:
{ "type": "workersql", "host": "api.workersql.com", "username": "myuser", "password": "mypass", "database": "mydb", "extra": { "apiKey": "your-api-key" }}
Create custom TypeORM driver:
import { createConnection } from '@workersql/node-sdk/mysql2-compat';import { Driver } from 'typeorm/driver/Driver';
export class WorkerSQLDriver extends Driver { async connect(): Promise<void> { this.connection = createConnection({ host: this.options.host, user: this.options.username, password: this.options.password, database: this.options.database, apiKey: this.options.extra?.apiKey }); }
// Implement other Driver methods...}
Usage with Sequelize
Section titled “Usage with Sequelize”import { Sequelize } from 'sequelize';import { createPool } from '@workersql/node-sdk/mysql2-compat';
const pool = createPool({ host: 'api.workersql.com', user: 'myuser', password: 'mypass', database: 'mydb', apiKey: 'your-api-key', connectionLimit: 10});
const sequelize = new Sequelize({ dialect: 'mysql', pool: { max: 10, min: 0, acquire: 30000, idle: 10000 }, dialectModule: { createPool: () => pool }});
// Define models as normalconst User = sequelize.define('User', { username: Sequelize.STRING, email: Sequelize.STRING});
// Use as normalconst users = await User.findAll();
Usage with Knex
Section titled “Usage with Knex”import knex from 'knex';
const db = knex({ client: 'mysql2', connection: { host: 'api.workersql.com', user: 'myuser', password: 'mypass', database: 'mydb', apiKey: 'your-api-key' }});
// Use as normalconst users = await db('users').where('id', 1);
Connection API
Section titled “Connection API”Connection Class
Section titled “Connection Class”class Connection { async query(sql: string, values?: any[]): Promise<[any, any]> async execute(sql: string, values?: any[]): Promise<[any, any]> async beginTransaction(): Promise<void> async commit(): Promise<void> async rollback(): Promise<void> async end(): Promise<void> async destroy(): Promise<void>}
Pool Class
Section titled “Pool Class”class Pool extends Connection { async getConnection(): Promise<Connection> async releaseConnection(connection: Connection): Promise<void>}
Factory Functions
Section titled “Factory Functions”function createConnection(options: ConnectionOptions): Connectionfunction createPool(options: PoolOptions): Pool
Connection Options
Section titled “Connection Options”interface ConnectionOptions { host?: string; // API host port?: number; // API port user?: string; // Username password?: string; // Password database?: string; // Database name apiKey?: string; // API key for authentication ssl?: boolean; // Enable SSL (default: true) timeout?: number; // Query timeout in ms dsn?: string; // Or use DSN directly}
interface PoolOptions extends ConnectionOptions { connectionLimit?: number; // Max connections (default: 10) waitForConnections?: boolean; // Wait for available connection queueLimit?: number; // Max queued connection requests}
Query Execution
Section titled “Query Execution”Simple Query
Section titled “Simple Query”const [rows, fields] = await connection.query('SELECT * FROM users WHERE id = ?', [1]);console.log(rows);
Prepared Statement
Section titled “Prepared Statement”const [rows] = await connection.execute( 'SELECT * FROM users WHERE email = ? AND status = ?',);
Transaction
Section titled “Transaction”await connection.beginTransaction();try { await connection.query('UPDATE accounts SET balance = balance - ? WHERE id = ?', [100, 1]); await connection.query('UPDATE accounts SET balance = balance + ? WHERE id = ?', [100, 2]); await connection.commit();} catch (error) { await connection.rollback(); throw error;}
Pool Usage
Section titled “Pool Usage”const pool = createPool({ host: 'api.workersql.com', user: 'myuser', password: 'mypass', database: 'mydb', apiKey: 'your-api-key', connectionLimit: 10});
// Automatic connection managementconst [rows] = await pool.query('SELECT * FROM users');
// Manual connection managementconst connection = await pool.getConnection();try { await connection.beginTransaction(); await connection.query('INSERT INTO users (name) VALUES (?)', ['John']); await connection.commit();} finally { await pool.releaseConnection(connection);}
// Close poolawait pool.end();
Usage with Express.js
Section titled “Usage with Express.js”import express from 'express';import { createPool } from '@workersql/node-sdk/mysql2-compat';
const app = express();const pool = createPool({ host: 'api.workersql.com', user: 'myuser', password: 'mypass', database: 'mydb', apiKey: process.env.WORKERSQL_API_KEY, connectionLimit: 10});
app.get('/users/:id', async (req, res) => { try { const [rows] = await pool.query('SELECT * FROM users WHERE id = ?', [req.params.id]); if (rows.length === 0) { return res.status(404).json({ error: 'User not found' }); } res.json(rows[0]); } catch (error) { res.status(500).json({ error: error.message }); }});
app.post('/users', async (req, res) => { const { username, email } = req.body; try { const [result] = await pool.query( 'INSERT INTO users (username, email) VALUES (?, ?)', [username, email] ); res.status(201).json({ id: result.insertId }); } catch (error) { res.status(500).json({ error: error.message }); }});
app.listen(3000, () => { console.log('Server running on port 3000');});
Usage with NestJS
Section titled “Usage with NestJS”import { Module } from '@nestjs/common';import { TypeOrmModule } from '@nestjs/typeorm';
@Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'api.workersql.com', username: 'myuser', password: 'mypass', database: 'mydb', extra: { apiKey: process.env.WORKERSQL_API_KEY }, entities: [User], synchronize: false, }), ],})export class AppModule {}
// Use repository pattern as normal@Injectable()export class UsersService { constructor( @InjectRepository(User) private usersRepository: Repository<User>, ) {}
async findOne(id: number): Promise<User> { return this.usersRepository.findOne({ where: { id } }); }}
Error Handling
Section titled “Error Handling”import { Connection } from '@workersql/node-sdk/mysql2-compat';
try { const [rows] = await connection.query('SELECT * FROM users WHERE id = ?', [1]);} catch (error) { if (error.code === 'CONNECTION_ERROR') { // Handle connection error } else if (error.code === 'INVALID_QUERY') { // Handle query error } else { // Handle other errors }}
Limitations
Section titled “Limitations”- No Native Protocol: Uses HTTP API instead of MySQL wire protocol
- Batch Transactions: Transactions queued via WebSocket
- Streaming: Result streaming not yet supported
- Multi-Statement: Not supported in single query
- Metadata: Limited result metadata compared to mysql2
Performance Considerations
Section titled “Performance Considerations”- Connection Pooling: Managed by underlying WorkerSQLClient
- Edge Caching: Queries benefit from edge cache
- Transaction Overhead: WebSocket sticky sessions minimize latency
- Prepared Statements: Client-side statement caching
Testing
Section titled “Testing”Run mysql2 compatibility tests:
npm test -- mysql2-compat
Migration from mysql2
Section titled “Migration from mysql2”Before (mysql2)
Section titled “Before (mysql2)”import mysql from 'mysql2/promise';
const pool = mysql.createPool({ host: 'localhost', user: 'root', password: 'password', database: 'mydb'});
const [rows] = await pool.query('SELECT * FROM users');
After (WorkerSQL)
Section titled “After (WorkerSQL)”import { createPool } from '@workersql/node-sdk/mysql2-compat';
const pool = createPool({ host: 'api.workersql.com', user: 'root', password: 'password', database: 'mydb', apiKey: 'your-api-key'});
const [rows] = await pool.query('SELECT * FROM users');
Type Definitions
Section titled “Type Definitions”Full TypeScript support with type definitions:
import type { Connection, Pool, ConnectionOptions, PoolOptions } from '@workersql/node-sdk/mysql2-compat';
Future Enhancements
Section titled “Future Enhancements”- Result streaming support
- Enhanced connection pool statistics
- Query caching improvements
- Multi-statement query support
- Binary protocol support
Support
Section titled “Support”For issues or questions:
- GitHub: https://github.com/healthfees-org/workersql
- Documentation: /docs/architecture/010-sdk-integration.md