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
npm install scyllinxUsing yarn
yarn add scyllinxUsing pnpm
pnpm add scyllinxDatabase Drivers
ScyllinX requires additional database drivers depending on which database you're using:
ScyllaDB / Cassandra
npm install cassandra-driverPostgreSQL
npm install pg
npm install @types/pg # If using TypeScriptMySQL
npm install mysql2SQLite
npm install sqlite3TypeScript Configuration
If you're using TypeScript, add these compiler options to your tsconfig.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.mdBasic Setup
1. Database Configuration
Create a database configuration file:
// 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
// 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
// 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
// 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
// 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:
// 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:
# .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=cassandraDocker Setup
For development, you can use Docker to run ScyllaDB:
# 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:
docker-compose up -dVerification
Test your installation with this simple script:
// 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:
// Increase connection timeout
connections: {
scylladb: {
// ... other config
socketOptions: {
connectTimeout: 30000,
readTimeout: 30000
}
}
}SSL/TLS Issues
For secure connections:
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:
npm install --save-dev typescript @types/nodeNext Steps
Now that you have ScyllinX installed and configured:
- Quick Start - Build your first application
- Models - Learn about the Active Record pattern
- Query Builder - Master database queries
- Migrations - Manage your database schema
Getting Help
If you run into issues during installation:
- Check the GitHub Issues
- Join our Discord community
