/kysely-singlestore

Kysely dialects, plugins and other goodies for Singlestore (formerly MemSQL)

Primary LanguageTypeScriptMIT LicenseMIT

Logo

kysely-singlestore

Codacy Badge Powered by TypeScript

Kysely dialects, plugins and other goodies for SingleStore (formerly MemSQL).

Installation

Node.js

NPM 7+

npm i kysely-singlestore

NPM <7

npm i kysely-singlestore kysely

Yarn

yarn add kysely-singlestore kysely

PNPM

pnpm add kysely-singlestore kysely

Deno

This package uses/extends some Kysely types and classes, which are imported using it's NPM package name -- not a relative file path or CDN url.

To fix that, add an import_map.json file.

{
  "imports": {
    "kysely": "https://cdn.jsdelivr.net/npm/kysely@0.22.0/dist/esm/index.js"
  }
}

Usage

Data API Dialect

SingleStore Data API allows executing SQL queries in the browser and is a great fit for serverless functions and other auto-scaling compute services. It does not support transactions at this point in time.

Node.js 16.8+

Older node versions are supported as well, just swap undici with node-fetch.

import {Kysely} from 'kysely'
import {SingleStoreDataApiDialect, SingleStoreDataType} from 'kysely-singlestore'
import {fetch} from 'undici'

interface Database {
  person: {
    id: string
    first_name: string | null
    last_name: string | null
  }
  pet: {
    id: string
    name: string
    owner_id: string
  }
}

const db = new Kysely<Database>({
  dialect: new SingleStoreDataApiDialect({
    database: '<database>',
    deserialization: {
      castDatesAsNativeDates: true,
      castTinyIntAsBoolean: true,
      deserialize: (value, dataType, columnName) =>
        dataType === SingleStoreDataType.Json && columnName === 'pet' ? new Pet(value) : undefined,
      unwrapDecimals: true,
    },
    fetch,
    hostname: '<hostname>',
    password: '<password>',
    username: '<username>',
  }),
})

Browser

import {Kysely} from 'kysely'
import {SingleStoreDataApiDialect, SingleStoreDataType} from 'kysely-singlestore'

interface Database {
  person: {
    id: string
    first_name: string | null
    last_name: string | null
  }
  pet: {
    id: string
    name: string
    owner_id: string
  }
}

const db = new Kysely<Database>({
  dialect: new SingleStoreDataApiDialect({
    database: '<database>',
    deserialization: {
      castDatesAsNativeDates: true,
      castTinyIntAsBoolean: true,
      deserialize: (value, dataType, columnName) =>
        dataType === SingleStoreDataType.Json && columnName === 'pet' ? new Pet(value) : undefined,
      unwrapDecimals: true,
    },
    fetch: window.fetch.bind(window),
    hostname: '<hostname>',
    password: '<password>',
    username: '<username>',
  }),
})

Deno

import {Kysely} from 'https://cdn.jsdelivr.net/npm/kysely@0.22.0/dist/esm/index.js'
import {
  SingleStoreDataApiDialect,
  SingleStoreDataType,
} from 'https://cdn.jsdelivr.net/npm/kysely-singlestore@latest/dist/esm/index.js'

interface Database {
  person: {
    id: string
    first_name: string | null
    last_name: string | null
  }
  pet: {
    id: string
    name: string
    owner_id: string
  }
}

const db = new Kysely<Database>({
  dialect: new SingleStoreDataApiDialect({
    database: '<database>',
    deserialization: {
      castDatesAsNativeDates: true,
      castTinyIntAsBoolean: true,
      deserialize: (value, dataType, columnName) =>
        dataType === SingleStoreDataType.Json && columnName === 'pet' ? new Pet(value) : undefined,
      unwrapDecimals: true,
    },
    fetch: fetch,
    hostname: '<hostname>',
    password: '<password>',
    username: '<username>',
  }),
})

"Classic" Dialect - SoonTM

SingleStore is wire-compatible with MySQL so you can connect to it using mysql2 in node environments, and take advantage of connection pools and transactions.

License

MIT License, see LICENSE