Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/scale3-labs/clickhouse-schema
Dynamic typescript type inference by writing clickhouse CREATE TABLE queries as schemas
https://github.com/scale3-labs/clickhouse-schema
clickhouse type-inference typescript
Last synced: 2 months ago
JSON representation
Dynamic typescript type inference by writing clickhouse CREATE TABLE queries as schemas
- Host: GitHub
- URL: https://github.com/scale3-labs/clickhouse-schema
- Owner: Scale3-Labs
- License: mit
- Created: 2024-03-17T00:57:07.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-04-05T15:24:19.000Z (9 months ago)
- Last Synced: 2024-10-13T08:59:57.622Z (3 months ago)
- Topics: clickhouse, type-inference, typescript
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/clickhouse-schema
- Size: 141 KB
- Stars: 4
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# ClickHouse-Schema Guide
In ClickHouse, defining and managing table schemas and their associated types can be done either manually or through the ClickHouse-Schema library. This guide compares these two approaches to illustrate the simplicity and efficiency ClickHouse-Schema brings to your projects.
## Traditional Manual Query Approach
Traditionally, creating a table in clickhouse requires manually writing the SQL query and the interface in your code. This method is straightforward but prone to errors and inconsistencies, especially when schema changes occur.
### Create Table Query
```sql
CREATE TABLE IF NOT EXISTS students
(
id UInt32,
name String,
height float32,
age UInt8,
weight Float64,,
isStudent Boolean
)
# Manually defined
interface StudentsTableTypeManuallyDefined {
id: number,
name: string,
age: number,
height: number,
weight: number,
isStudent: boolean
}
```**Did you notice any errors with the code below?** These would not get caught till runtime
## Using ClickHouse-Schema
ClickHouse-Schema automates schema creation and ensures type safety with minimal code, providing a more robust and maintainable solution.
### Defining Schema
``` typescript
const studentsTableSchema = new ClickhouseSchema({
id: { type: CHUInt32() },
name: { type: CHString() },
age: { type: CHUInt8() },
height: { type: CHFloat32() },
weight: { type: CHFloat64() },
isStudent: { type: CHBoolean() }
}, {
table_name: 'students',
primary_key: 'id'
})//Automatic type inference. If schema changes type automatically changes too
type StudentsTableType = InferClickhouseSchemaType
```## Getting Started
To start using ClickHouse-Schema in your projects, follow these steps:
1. **Installation**
To install ClickHouse-Schema, run the following command in your terminal:```bash
npm install clickhouse-schema
```2. **Create a Schema**
Define your table schema and provide options such as the table name and primary key. This will enable automatic type inference, making your code more robust and maintainable.
``` typescript
import {
ClickhouseSchema, CHUInt32, CHString, CHUInt8, CHFloat32, CHFloat64, CHBoolean, InferClickhouseSchemaType
} from 'clickhouse-schema'// Use types directly or import ClickhouseTypes object to get all the types in one place
const studentsTableSchema = new ClickhouseSchema({
id: { type: CHUInt32() },
name: { type: CHString() },
age: { type: CHUInt8() },
height: { type: CHFloat32() },
weight: { type: CHFloat64() },
isStudent: { type: CHBoolean() }
}, {
table_name: 'students',
primary_key: 'id'
})
type MyTableType = InferClickhouseSchemaType
```3. **Utilize Schema Methods**
ClickHouse-Schema provides several methods to streamline working with your database schema:- Use `.GetCreateTableQuery()` or `.toString()` to generate the SQL `CREATE TABLE` query.
- Use `.GetOptions()` to access the options passed when creating the table schema.
- Use `.GetCreateTableQueryAsList()` to get the `CREATE TABLE` query as a list of strings, which can be helpful for debugging or logging.## Supported Types
- Integer (signed and unsigned integers): `UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256` types
- Floating-point numbers: `Float32` and `Float64` types
- Decimal - `Decimal` type
- Boolean: `Boolean` type
- Strings: `String` and `FixedString` types
- Dates: `Date`, `Date32`, `DateTime` and `DateTime64` types
- JSON: `JSON` type
- UUID: `UUID` type
- Arrays: `Array` type
- Nullable: `Nullable` type
- LowCardinality: `LowCardinality` and `Enum` types
- IP Addresses - `IPv4` and `IPv6`And support for more types is coming!