Skip to content

Installation

This guide will walk you through installing ScyllinX and setting up your first database connection.

Prerequisites

Before installing ScyllinX, make sure you have:

  • Node.js 16.0.0 or higher
  • TypeScript 4.5 or higher (if using TypeScript)
  • ScyllaDB or a supported SQL database

Installing ScyllinX

Using npm

bash
npm install scyllinx

Using yarn

bash
yarn add scyllinx

Using pnpm

bash
pnpm add scyllinx

Database Drivers

ScyllinX requires additional database drivers depending on which database you're using:

ScyllaDB / Cassandra

bash
npm install cassandra-driver

PostgreSQL

bash
npm install pg
npm install @types/pg  # If using TypeScript

MySQL

bash
npm install mysql2

SQLite

bash
npm install sqlite3

TypeScript Configuration

If you're using TypeScript, add these compiler options to your tsconfig.json:

json
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "lib": ["ES2020"],
    "strict": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "resolveJsonModule": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}

Project Structure

Here's a recommended project structure for a ScyllinX application:

my-app/
├── src/
│   ├── models/
│   │   ├── User.ts
│   │   ├── Post.ts
│   │   └── index.ts
│   ├── migrations/
│   │   ├── 2024_01_01_000001_create_users_table.ts
│   │   └── 2024_01_01_000002_create_posts_table.ts
│   ├── seeders/
│   │   ├── UserSeeder.ts
│   │   └── DatabaseSeeder.ts
│   ├── factories/
│   │   ├── UserFactory.ts
│   │   └── PostFactory.ts
│   ├── config/
│   │   └── database.ts
│   └── index.ts
├── package.json
├── tsconfig.json
└── README.md

Basic Setup

1. Database Configuration

Create a database configuration file:

typescript
// src/config/database.ts
import { ConnectionConfig } from 'scyllinx';

export const databaseConfig: ConnectionConfig = {
  default: 'scylladb',
  
  connections: {
    scylladb: {
      driver: 'scylladb',
      contactPoints: ['127.0.0.1'],
      localDataCenter: 'datacenter1',
      keyspace: 'my_app',
      credentials: {
        username: 'cassandra',
        password: 'cassandra'
      }
    },
    
    postgres: {
      driver: 'postgres',
      host: 'localhost',
      port: 5432,
      database: 'my_app',
      username: 'postgres',
      password: 'password'
    }
  }
};

2. Initialize Connection

typescript
// src/index.ts
import { ConnectionManager } from 'scyllinx';
import { databaseConfig } from './config/database';

async function main() {
  // Initialize the connection manager
  const connectionManager = ConnectionManager.getInstance();
  await connectionManager.initialize(databaseConfig);
  
  // Your application code here
  console.log('Database connected successfully!');
}

main().catch(console.error);

3. Create Your First Model

typescript
// src/models/User.ts
import { Model } from 'scyllinx';

interface UserAttributes {
  id: string;
  name: string;
  email: string;
  created_at?: Date;
  updated_at?: Date;
}

export class User extends Model<UserAttributes> {
  protected static table = 'users';
  protected static primaryKey = 'id';
  protected static fillable = ['name', 'email'];
  protected static timestamps = true;
}

4. Create a Migration

typescript
// src/migrations/2024_01_01_000001_create_users_table.ts
import { Migration, Schema } from 'scyllinx';

export class CreateUsersTable extends Migration {
  async up(schema: Schema): Promise<void> {
    await schema.createTable('users', (table) => {
      table.uuid('id').primary();
      table.string('name');
      table.string('email').unique();
      table.timestamps();
    });
  }
  
  async down(schema: Schema): Promise<void> {
    await schema.dropTable('users');
  }
}

5. Run Migration

typescript
// src/migrate.ts
import { ConnectionManager, MigrationManager } from 'scyllinx';
import { databaseConfig } from './config/database';
import { CreateUsersTable } from './migrations/2024_01_01_000001_create_users_table';

async function runMigrations() {
  const connectionManager = ConnectionManager.getInstance();
  await connectionManager.initialize(databaseConfig);
  
  const migrationManager = new MigrationManager(connectionManager);
  
  const migrations = [
    new CreateUsersTable()
  ];
  
  await migrationManager.migrate(migrations);
  console.log('Migrations completed!');
}

runMigrations().catch(console.error);

Environment Variables

For production applications, use environment variables for sensitive configuration:

typescript
// src/config/database.ts
export const databaseConfig = {
  default: process.env.DB_CONNECTION || 'scylladb',
  
  connections: {
    scylladb: {
      driver: 'scylladb',
      contactPoints: process.env.SCYLLA_CONTACT_POINTS?.split(',') || ['127.0.0.1'],
      localDataCenter: process.env.SCYLLA_DATACENTER || 'datacenter1',
      keyspace: process.env.SCYLLA_KEYSPACE || 'my_app',
      credentials: {
        username: process.env.SCYLLA_USERNAME || 'cassandra',
        password: process.env.SCYLLA_PASSWORD || 'cassandra'
      }
    }
  }
};

Create a .env file:

bash
# .env
DB_CONNECTION=scylladb
SCYLLA_CONTACT_POINTS=127.0.0.1,127.0.0.2,127.0.0.3
SCYLLA_DATACENTER=datacenter1
SCYLLA_KEYSPACE=my_app
SCYLLA_USERNAME=cassandra
SCYLLA_PASSWORD=cassandra

Docker Setup

For development, you can use Docker to run ScyllaDB:

yaml
# docker-compose.yml
version: '3.8'

services:
  scylladb:
    image: scylladb/scylla:latest
    container_name: scylladb
    ports:
      - "9042:9042"
    environment:
      - SCYLLA_CLUSTER_NAME=test-cluster
      - SCYLLA_DC=datacenter1
      - SCYLLA_RACK=rack1
    volumes:
      - scylla-data:/var/lib/scylla

volumes:
  scylla-data:

Start the container:

bash
docker-compose up -d

Verification

Test your installation with this simple script:

typescript
// test-connection.ts
import { ConnectionManager, Model } from 'scyllinx';
import { databaseConfig } from './src/config/database';

interface TestAttributes {
  id: string;
  message: string;
}

class TestModel extends Model<TestAttributes> {
  protected static table = 'test_table';
}

async function testConnection() {
  try {
    const connectionManager = ConnectionManager.getInstance();
    await connectionManager.initialize(databaseConfig);
    
    console.log('✅ Database connection successful!');
    
    // Test a simple query
    const result = await TestModel.query().raw('SELECT now() as current_time');
    console.log('✅ Query execution successful!', result);
    
  } catch (error) {
    console.error('❌ Connection failed:', error);
  }
}

testConnection();

Common Issues

Connection Timeout

If you're getting connection timeouts:

typescript
// Increase connection timeout
connections: {
  scylladb: {
    // ... other config
    socketOptions: {
      connectTimeout: 30000,
      readTimeout: 30000
    }
  }
}

SSL/TLS Issues

For secure connections:

typescript
connections: {
  scylladb: {
    // ... other config
    sslOptions: {
      rejectUnauthorized: false, // For self-signed certificates
      // cert: fs.readFileSync('path/to/cert.pem'),
      // key: fs.readFileSync('path/to/key.pem'),
      // ca: fs.readFileSync('path/to/ca.pem')
    }
  }
}

TypeScript Errors

Make sure you have the correct TypeScript configuration and that all dependencies are properly installed:

bash
npm install --save-dev typescript @types/node

Next Steps

Now that you have ScyllinX installed and configured:

  1. Quick Start - Build your first application
  2. Models - Learn about the Active Record pattern
  3. Query Builder - Master database queries
  4. Migrations - Manage your database schema

Getting Help

If you run into issues during installation:

Released under the MIT License.