@dlovely/mysql
Version:
对mysql的简易连接,能创建数据库、数据表管理,并使用sql编辑器
559 lines (500 loc) • 23.1 kB
TypeScript
import type { Connection } from 'mysql2/promise';
import { ConnectionOptions } from 'mysql2/typings/mysql/lib/Connection';
import { mysql2TypingsMysqlLibProtocolPacketsOkPacket } from 'mysql2/typings/mysql/lib/protocol/packets/OkPacket';
import type { OkPacket } from 'mysql2';
import type { OkPacket as OkPacket_2 } from 'mysql2/promise';
import type { PoolConnection } from 'mysql2/promise';
import { PoolOptions } from 'mysql2/typings/mysql/lib/Pool';
declare type ColumnsName<
Columns extends TableColumns = never,
ColumnsRecord extends TableColumnsRecord = never
> =
| ([Columns] extends [never] ? never : TableColumnsName<Columns>)
| ([ColumnsRecord] extends [never]
? never
: TableColumnsRecordName<ColumnsRecord>)
declare namespace Create {
interface Options extends DataBase {
database: string
name: string
engine?: string
columns: Column[]
comment?: string
}
interface DataBase {
name: string
if_not_exists?: boolean
charset?: string
collate?: string
}
}
declare namespace Create {
type Column =
| NumberColumn
| StringColumn
| CharColumn
| DateColumn
| JsonColumn
| CollectColumn
interface BaseColumn {
name: string
comment?: string
default?: Default | string | number
not_null?: boolean
primary_key?: boolean
unique?: boolean | string
check?:
| {
rule: string
name?: string
}
| string
foreign_key?: {
name: string
table: string
table_key: string
on_update?: ForeignOperation
on_delete?: ForeignOperation
}
charset?: string
collate?: string
}
interface NumberColumn extends BaseColumn {
type:
| 'int'
| 'tinyint'
| 'smallint'
| 'mediumint'
| 'bigint'
| 'bool'
| 'float'
| 'double'
auto_increment?: boolean
default?: number
}
interface StringColumn extends BaseColumn {
type:
| 'text'
| 'tinytext'
| 'mediumtext'
| 'longtext'
| 'blob'
| 'tinyblob'
| 'mediumblob'
| 'longblob'
}
interface CharColumn extends BaseColumn {
type: 'char' | 'varchar'
length: number
}
interface DateColumn extends BaseColumn {
type: 'date' | 'datetime' | 'timestamp'
default?: Default
}
interface JsonColumn extends BaseColumn {
type: 'json'
not_null: true
default?: undefined
}
interface CollectColumn extends BaseColumn {
type: 'enum' | 'set'
values: string[]
}
type ForeignOperation =
| 'cascade'
| 'set null'
| 'set default'
| 'restrict'
| 'no action'
interface Default {
on_update?: boolean
}
}
export declare class DataBase<DB extends keyof MySql.DataBase> {
readonly name: DB;
constructor(name: DB);
setConfig({ charset, collate, }: {
charset?: string | undefined;
collate?: string | undefined;
}): Promise<mysql2TypingsMysqlLibProtocolPacketsOkPacket>;
/**
* 创建数据库
*/
create(options?: Omit<Create.DataBase, 'name'>): Promise<mysql2TypingsMysqlLibProtocolPacketsOkPacket>;
/** 抛弃数据库 */
drop(): Promise<mysql2TypingsMysqlLibProtocolPacketsOkPacket>;
}
export declare interface DBOptions {
/** 存储引擎 */
engine?: string;
/** 字符类型 */
charset?: string;
/** 字符编码 */
collate?: string;
}
export declare const defineMysqlConfig: (config: Partial<MysqlOptions>) => Partial<MysqlOptions>;
declare namespace Delete {
interface Options {
database?: string
table: string
where: Sql | Where.Options
}
}
declare type DoPick<T, K> = T extends any
? {
[Key in keyof T as Key extends K ? Key : never]: T[Key]
}
: never
declare type GenTableColumns<DB extends keyof MySql.DataBase, Name extends Split<keyof MySql.Table>[1], Columns = MySql.DataBase[DB][Name]> = UnionToTuple<MergeRecord<{
[Key in keyof Columns]: Columns[Key] & {
name: Key;
};
}[keyof Columns]>>;
declare type InsertColumns<Columns extends TableColumns> = MergeRecord<
{
[Key in Columns[number] as IsReadOnly<
Key,
never,
IsRequire<Key, Key['name'], never>
>]: Key['type']
} & {
[Key in Columns[number] as IsReadOnly<
Key,
never,
IsRequire<Key, never, Key['name']>
>]?: Key['type']
}
>
declare type IsExist<
Column extends TableColumn,
True = true,
False = false
> = Column['not_null'] extends true ? True : False
declare type IsReadOnly<
Column extends TableColumn,
True = true,
False = false
> = Column['readonly'] extends true ? True : False
declare type IsRequire<
Column extends TableColumn,
True = true,
False = false
> = Column['has_defa'] extends true
? False
: Column['not_null'] extends true
? True
: False
export declare class JoinTable<DB extends keyof MySql.DataBase, LCR extends TableColumnsRecord = never, RCR extends TableColumnsRecord = never, LN extends keyof MySql.DataBase[DB] & string = never, LC extends TableColumns = never, RN extends keyof MySql.DataBase[DB] & string = never, RC extends TableColumns = never, TCR extends TableColumnsRecord = MergeRecordWithoutNever<[
LCR,
RCR,
Record<LN, LC>,
Record<RN, RC>
]>> {
readonly left_table: Table<DB, LN, LC> | JoinTable<any, any, any, any, any, any, any, LCR>;
readonly left_key: ColumnsName<LC, LCR>;
readonly right_table: Table<DB, RN, RC> | JoinTable<any, any, any, any, any, any, any, RCR>;
readonly right_key: ColumnsName<RC, RCR>;
readonly join_type: JoinType;
constructor(left_table: Table<DB, LN, LC> | JoinTable<any, any, any, any, any, any, any, LCR>, left_key: ColumnsName<LC, LCR>, right_table: Table<DB, RN, RC> | JoinTable<any, any, any, any, any, any, any, RCR>, right_key: ColumnsName<RC, RCR>, join_type: JoinType);
private _used;
get used(): boolean;
get name(): string;
join<CR extends TableColumnsRecord = never, N extends keyof MySql.DataBase[DB] & string = never, C extends TableColumns = never>(table: Table<DB, N, C> | JoinTable<any, any, any, any, any, any, any, CR>, key: ColumnsName<C, CR>, self_key: ColumnsName<never, TCR>, type?: JoinType): JoinTable<DB, TCR, CR, never, never, N, C, [TCR] extends [never] ? [CR] extends [never] ? [Record<N, C>] extends [never] ? {} : MergeRecord<Record<never, never> & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<CR & Record<never, never>> : MergeRecord<CR & Record<never, never> & Record<N, C>> : [CR] extends [never] ? [Record<N, C>] extends [never] ? MergeRecord<TCR & Record<never, never>> : MergeRecord<TCR & Record<never, never> & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<TCR & CR & Record<never, never>> : MergeRecord<TCR & CR & Record<never, never> & Record<N, C>>>;
leftJoin<CR extends TableColumnsRecord = never, N extends keyof MySql.DataBase[DB] & string = never, C extends TableColumns = never>(table: Table<DB, N, C> | JoinTable<any, any, any, any, any, any, any, CR>, key: ColumnsName<C, CR>, self_key: ColumnsName<never, TCR>): JoinTable<DB, TCR, CR, never, never, N, C, [TCR] extends [never] ? [CR] extends [never] ? [Record<N, C>] extends [never] ? {} : MergeRecord<Record<never, never> & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<CR & Record<never, never>> : MergeRecord<CR & Record<never, never> & Record<N, C>> : [CR] extends [never] ? [Record<N, C>] extends [never] ? MergeRecord<TCR & Record<never, never>> : MergeRecord<TCR & Record<never, never> & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<TCR & CR & Record<never, never>> : MergeRecord<TCR & CR & Record<never, never> & Record<N, C>>>;
rightJoin<CR extends TableColumnsRecord = never, N extends keyof MySql.DataBase[DB] & string = never, C extends TableColumns = never>(table: Table<DB, N, C> | JoinTable<any, any, any, any, any, any, any, CR>, key: ColumnsName<C, CR>, self_key: ColumnsName<never, TCR>): JoinTable<DB, TCR, CR, never, never, N, C, [TCR] extends [never] ? [CR] extends [never] ? [Record<N, C>] extends [never] ? {} : MergeRecord<Record<never, never> & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<CR & Record<never, never>> : MergeRecord<CR & Record<never, never> & Record<N, C>> : [CR] extends [never] ? [Record<N, C>] extends [never] ? MergeRecord<TCR & Record<never, never>> : MergeRecord<TCR & Record<never, never> & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<TCR & CR & Record<never, never>> : MergeRecord<TCR & CR & Record<never, never> & Record<N, C>>>;
fullJoin<CR extends TableColumnsRecord = never, N extends keyof MySql.DataBase[DB] & string = never, C extends TableColumns = never>(table: Table<DB, N, C> | JoinTable<any, any, any, any, any, any, any, CR>, key: ColumnsName<C, CR>, self_key: ColumnsName<never, TCR>): JoinTable<DB, TCR, CR, never, never, N, C, [TCR] extends [never] ? [CR] extends [never] ? [Record<N, C>] extends [never] ? {} : MergeRecord<Record<never, never> & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<CR & Record<never, never>> : MergeRecord<CR & Record<never, never> & Record<N, C>> : [CR] extends [never] ? [Record<N, C>] extends [never] ? MergeRecord<TCR & Record<never, never>> : MergeRecord<TCR & Record<never, never> & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<TCR & CR & Record<never, never>> : MergeRecord<TCR & CR & Record<never, never> & Record<N, C>>>;
select<Column extends Partial<TableColumnsRecordMap<TCR>>>(columns?: Column, where?: Select.Options['where'], options?: Omit<Select.Options, 'table' | 'columns' | 'where'>): Promise<SelectColumnsRecord<TCR, Column>[]>;
get __showTCR(): TCR;
}
export declare enum JoinType {
INNER = "INNER",
LEFT = "LEFT",
RIGHT = "RIGHT",
FULL = "FULL"
}
declare interface KeyType_2 {
/** json是否为数组 */
is_array?: boolean;
/** 指定键值对 */
records?: Record<string, string | KeyType_2>;
/** string泛值 */
string?: string | KeyType_2;
/** number泛值 */
number?: string | KeyType_2;
}
export { KeyType_2 as KeyType }
/**
* LastInUnion<1 | 2> = 2.
*/
declare type LastInUnion<U> = UnionToIntersection2<
U extends unknown ? (x: U) => 0 : never
> extends (x: infer L) => 0
? L
: never
declare type MergeRecord<T extends Record<PropertyKey, unknown>> =
T extends Record<PropertyKey, unknown>
? {
[K in keyof T]: T[K]
}
: never
declare type MergeRecordWithoutNever<
T extends Record<PropertyKey, unknown>[],
R extends Record<PropertyKey, unknown> = {}
> = T extends [infer F, ...infer L extends Array<Record<PropertyKey, unknown>>]
? [F] extends [never]
? MergeRecordWithoutNever<L, R>
: MergeRecordWithoutNever<L, R & F>
: MergeRecord<R>
export declare interface MysqlOptions {
/** mysql连接类型 */
type: 'pool' | 'connection';
/** mysql连接参数 */
config: ConnectionOptions | PoolOptions;
/** 数据库默认选项 */
database?: DBOptions;
/** json键的具体类型配置 */
json_key?: Record<string, Record<string, Record<string, KeyType_2>>>;
}
export declare class MysqlServer {
readonly type: "pool" | "connection";
readonly config: ConnectionOptions | PoolOptions;
readonly options: DBOptions | undefined;
readonly json_key: Record<string, Record<string, Record<string, KeyType_2>>> | undefined;
constructor();
private _active_database;
/** 当前选中的database */
get active_database(): string | undefined;
/** 切换选中的database */
use(database: string): void;
private _pool?;
/** 从配置处获取连接 */
getConnection(): Promise<{
active_database?: string;
connection: Connection;
release: () => void;
}>;
/**
* 从配置处获取连接
* @ 传入泛型以明确表示从连接池获取连接
*/
getConnection<T extends true>(): Promise<{
active_database?: string;
connection: PoolConnection;
release: () => void;
}>;
/**
* 调用连接执行execute,并自动释放连接
* @ 不传入泛型提示返回OkPacket
*/
execute(options: string | Partial<SqlWithParams>, database?: string): Promise<OkPacket_2>;
/**
* 调用连接执行execute,并自动释放连接
* @ 传入泛型提示返回类型数组
*/
execute<T extends Record<string, unknown>>(options: string | Partial<SqlWithParams>, database?: string): Promise<T[]>;
/** 调用连接并获取事务实例 */
transaction(): Promise<Transaction>;
}
export { OkPacket }
declare namespace Select {
interface Options {
database?: string
table: string
distinct?: boolean
columns?: string[]
where?: Sql | Where.Options
order_by?: Record<string, OrderByType>
range?: Range
}
type OrderByType = boolean | 'desc' | 'asc'
type Range =
| number
| [number, number]
| { limit: number; offset: number }
type JoinColumn = Record<string, string[]>
interface JoinOptions extends Omit<Options, 'columns'> {
columns?: JoinColumn
}
}
declare type SelectColumns<Columns extends TableColumns> = MergeRecord<
{
readonly [Key in Columns[number] as IsReadOnly<
Key,
IsExist<Key, Key['name'], never>,
never
>]: Key['type']
} & {
readonly [Key in Columns[number] as IsReadOnly<
Key,
IsExist<Key, never, Key['name']>,
never
>]?: Key['type']
} & {
[Key in Columns[number] as IsReadOnly<
Key,
never,
IsExist<Key, Key['name'], never>
>]: Key['type']
} & {
[Key in Columns[number] as IsReadOnly<
Key,
never,
IsExist<Key, never, Key['name']>
>]?: Key['type']
}
>
declare type SelectColumnsPick<
Columns extends TableColumns,
Column extends TableColumnsName<Columns>
> = [Column] extends [never]
? SelectColumns<Columns>
: DoPick<SelectColumns<Columns>, Column>
declare type SelectColumnsRecord<
ColumnsRecord extends TableColumnsRecord,
Column extends Partial<TableColumnsRecordMap<ColumnsRecord>>
> = [Column] extends [never]
? UnionToIntersection<
{
[Table in keyof ColumnsRecord]: SelectColumns<ColumnsRecord[Table]>
}[keyof ColumnsRecord]
>
: UnionToIntersection<
{
[Table in keyof Column]: Table extends keyof ColumnsRecord
? Column[Table] extends Array<infer Col extends string>
? SelectColumnsPick<ColumnsRecord[Table], Col>
: never
: never
}[keyof Column]
>
declare type Split<
T extends string,
D extends string = '.'
> = T extends `${infer F}${D}${infer L}` ? [F, ...Split<L, D>] : [T]
declare type Sql = SqlWithParams | SqlWithParams['sql']
declare interface SqlWithParams {
sql: string
params: any[]
}
export declare class Table<DB extends keyof MySql.DataBase, Name extends keyof MySql.DataBase[DB] & string, Columns extends TableColumns = GenTableColumns<DB, Name>> {
readonly database: DB;
readonly name: Name;
constructor(database: DB, name: Name);
private readonly _json_keys;
insert(...datas: InsertColumns<Columns>[]): Promise<OkPacket>;
delete(where: Delete.Options['where']): Promise<OkPacket>;
update(data: UpdateColumns<Columns>, where?: Update.Options['where']): Promise<OkPacket>;
select<Column extends Columns[number]['name']>(columns?: Column[], where?: Select.Options['where'], options?: Omit<Select.Options, 'table' | 'columns' | 'where'>): Promise<SelectColumnsPick<Columns, Column>[]>;
join<CR extends TableColumnsRecord = never, N extends keyof MySql.DataBase[DB] & string = never, C extends TableColumns = never>(table: Table<DB, N, C> | JoinTable<any, any, any, any, any, any, any, CR>, key: ColumnsName<C, CR>, self_key: ColumnsName<Columns, never>, type?: JoinType): JoinTable<DB, never, CR, Name, Columns, N, C, [CR] extends [never] ? [Record<Name, Columns>] extends [never] ? [Record<N, C>] extends [never] ? {} : MergeRecord<Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<Record<Name, Columns>> : MergeRecord<Record<Name, Columns> & Record<N, C>> : [Record<Name, Columns>] extends [never] ? [Record<N, C>] extends [never] ? MergeRecord<{} & CR> : MergeRecord<CR & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<CR & Record<Name, Columns>> : MergeRecord<CR & Record<Name, Columns> & Record<N, C>>>;
leftJoin<CR extends TableColumnsRecord = never, N extends keyof MySql.DataBase[DB] & string = never, C extends TableColumns = never>(table: Table<DB, N, C> | JoinTable<any, any, any, any, any, any, any, CR>, key: ColumnsName<C, CR>, self_key: ColumnsName<Columns, never>): JoinTable<DB, never, CR, Name, Columns, N, C, [CR] extends [never] ? [Record<Name, Columns>] extends [never] ? [Record<N, C>] extends [never] ? {} : MergeRecord<Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<Record<Name, Columns>> : MergeRecord<Record<Name, Columns> & Record<N, C>> : [Record<Name, Columns>] extends [never] ? [Record<N, C>] extends [never] ? MergeRecord<{} & CR> : MergeRecord<CR & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<CR & Record<Name, Columns>> : MergeRecord<CR & Record<Name, Columns> & Record<N, C>>>;
rightJoin<CR extends TableColumnsRecord = never, N extends keyof MySql.DataBase[DB] & string = never, C extends TableColumns = never>(table: Table<DB, N, C> | JoinTable<any, any, any, any, any, any, any, CR>, key: ColumnsName<C, CR>, self_key: ColumnsName<Columns, never>): JoinTable<DB, never, CR, Name, Columns, N, C, [CR] extends [never] ? [Record<Name, Columns>] extends [never] ? [Record<N, C>] extends [never] ? {} : MergeRecord<Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<Record<Name, Columns>> : MergeRecord<Record<Name, Columns> & Record<N, C>> : [Record<Name, Columns>] extends [never] ? [Record<N, C>] extends [never] ? MergeRecord<{} & CR> : MergeRecord<CR & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<CR & Record<Name, Columns>> : MergeRecord<CR & Record<Name, Columns> & Record<N, C>>>;
fullJoin<CR extends TableColumnsRecord = never, N extends keyof MySql.DataBase[DB] & string = never, C extends TableColumns = never>(table: Table<DB, N, C> | JoinTable<any, any, any, any, any, any, any, CR>, key: ColumnsName<C, CR>, self_key: ColumnsName<Columns, never>): JoinTable<DB, never, CR, Name, Columns, N, C, [CR] extends [never] ? [Record<Name, Columns>] extends [never] ? [Record<N, C>] extends [never] ? {} : MergeRecord<Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<Record<Name, Columns>> : MergeRecord<Record<Name, Columns> & Record<N, C>> : [Record<Name, Columns>] extends [never] ? [Record<N, C>] extends [never] ? MergeRecord<{} & CR> : MergeRecord<CR & Record<N, C>> : [Record<N, C>] extends [never] ? MergeRecord<CR & Record<Name, Columns>> : MergeRecord<CR & Record<Name, Columns> & Record<N, C>>>;
create(columns: Create.Options['columns'], options?: Omit<Create.Options, 'database' | 'name' | 'columns'>): Promise<OkPacket>;
truncate(): Promise<OkPacket>;
drop(): Promise<OkPacket>;
}
declare interface TableColumn {
readonly name: string
readonly type: unknown
readonly not_null: boolean
readonly has_defa: boolean
readonly readonly: boolean
}
declare type TableColumns = readonly TableColumn[]
declare type TableColumnsName<Columns extends TableColumns> =
Columns[number]['name']
declare type TableColumnsRecord = Record<string, TableColumns>
declare type TableColumnsRecordMap<ColumnsRecord extends TableColumnsRecord> =
ColumnsRecord extends TableColumnsRecord
? {
[Table in keyof ColumnsRecord]: TableColumnsName<ColumnsRecord[Table]>[]
}
: never
declare type TableColumnsRecordName<ColumnsRecord extends TableColumnsRecord> = {
[Table in keyof ColumnsRecord]: Table extends string
? `${Table}.${TableColumnsName<ColumnsRecord[Table]>}`
: never
}[keyof ColumnsRecord]
declare class Transaction {
private type;
private readonly connection;
constructor(type: 'connection' | 'pool', connection: Connection | PoolConnection);
private _active;
get active(): boolean;
begin(): Promise<void>;
/**
* 调用连接执行execute,并自动释放连接
* @ 不传入泛型提示返回OkPacket
*/
execute(options: string | Partial<SqlWithParams>): Promise<OkPacket_2>;
/**
* 调用连接执行execute,并自动释放连接
* @ 传入泛型提示返回类型数组
*/
execute<T extends Record<string, unknown>>(options: string | Partial<SqlWithParams>): Promise<T[]>;
commit(): Promise<void>;
private _handleError;
setHandleError(handleError: typeof Transaction._handleError): void;
release(): Promise<void>;
private _rollback;
rollback(): Promise<void>;
}
declare type UnionToIntersection<U extends Record<PropertyKey, unknown>> = (
U extends unknown ? (k: U) => void : never
) extends (k: infer I extends Record<PropertyKey, unknown>) => void
? MergeRecord<I>
: never
/**
* UnionToIntersection<{ foo: string } | { bar: string }> =
* { foo: string } & { bar: string }.
*/
declare type UnionToIntersection2<U> = (
U extends unknown ? (arg: U) => 0 : never
) extends (arg: infer I) => 0
? I
: never
/**
* UnionToTuple<1 | 2> = [1, 2].
*/
declare type UnionToTuple<U, Last = LastInUnion<U>> = [U] extends [never]
? []
: [...UnionToTuple<Exclude<U, Last>>, Last]
declare namespace Update {
interface Options {
database?: string
table: string
data: Record<string, unknown>
where?: Sql | Where.Options
json_key?: Map<string, string>
}
}
declare type UpdateColumns<Columns extends TableColumns> = MergeRecord<{
[Key in Columns[number] as IsReadOnly<Key, never, Key['name']>]?: Key['type']
}>
export declare const useServer: () => MysqlServer;
declare namespace Where {
type Options = Single | Unions
type CompareType = '=' | '<>' | '<' | '<=' | '>' | '>='
interface Compare {
key: string
val: any
type: CompareType
}
interface Like {
key: string
like: string
}
interface Between {
key: string
min: number
max: number
}
interface In {
key: string
vals: any[]
}
type Single = Compare | Like | Between | In
type UnionType = 'and' | 'or'
type Unions = [UnionType, Options, Options]
}
export { }