insert.d.cts 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import type { WithCacheConfig } from "../../cache/core/types.cjs";
  2. import { entityKind } from "../../entity.cjs";
  3. import type { MySqlDialect } from "../dialect.cjs";
  4. import type { AnyMySqlQueryResultHKT, MySqlPreparedQueryConfig, MySqlQueryResultHKT, MySqlQueryResultKind, MySqlSession, PreparedQueryHKTBase, PreparedQueryKind } from "../session.cjs";
  5. import type { MySqlTable } from "../table.cjs";
  6. import type { TypedQueryBuilder } from "../../query-builders/query-builder.cjs";
  7. import { QueryPromise } from "../../query-promise.cjs";
  8. import type { RunnableQuery } from "../../runnable-query.cjs";
  9. import type { Placeholder, Query, SQLWrapper } from "../../sql/sql.cjs";
  10. import { Param, SQL } from "../../sql/sql.cjs";
  11. import type { InferModelFromColumns } from "../../table.cjs";
  12. import type { AnyMySqlColumn } from "../columns/common.cjs";
  13. import { QueryBuilder } from "./query-builder.cjs";
  14. import type { SelectedFieldsOrdered } from "./select.types.cjs";
  15. import type { MySqlUpdateSetSource } from "./update.cjs";
  16. export interface MySqlInsertConfig<TTable extends MySqlTable = MySqlTable> {
  17. table: TTable;
  18. values: Record<string, Param | SQL>[] | MySqlInsertSelectQueryBuilder<TTable> | SQL;
  19. ignore: boolean;
  20. onConflict?: SQL;
  21. returning?: SelectedFieldsOrdered;
  22. select?: boolean;
  23. }
  24. export type AnyMySqlInsertConfig = MySqlInsertConfig<MySqlTable>;
  25. export type MySqlInsertValue<TTable extends MySqlTable> = {
  26. [Key in keyof TTable['$inferInsert']]: TTable['$inferInsert'][Key] | SQL | Placeholder;
  27. } & {};
  28. export type MySqlInsertSelectQueryBuilder<TTable extends MySqlTable> = TypedQueryBuilder<{
  29. [K in keyof TTable['$inferInsert']]: AnyMySqlColumn | SQL | SQL.Aliased | TTable['$inferInsert'][K];
  30. }>;
  31. export declare class MySqlInsertBuilder<TTable extends MySqlTable, TQueryResult extends MySqlQueryResultHKT, TPreparedQueryHKT extends PreparedQueryHKTBase> {
  32. private table;
  33. private session;
  34. private dialect;
  35. static readonly [entityKind]: string;
  36. private shouldIgnore;
  37. constructor(table: TTable, session: MySqlSession, dialect: MySqlDialect);
  38. ignore(): this;
  39. values(value: MySqlInsertValue<TTable>): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;
  40. values(values: MySqlInsertValue<TTable>[]): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;
  41. select(selectQuery: (qb: QueryBuilder) => MySqlInsertSelectQueryBuilder<TTable>): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;
  42. select(selectQuery: (qb: QueryBuilder) => SQL): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;
  43. select(selectQuery: SQL): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;
  44. select(selectQuery: MySqlInsertSelectQueryBuilder<TTable>): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;
  45. }
  46. export type MySqlInsertWithout<T extends AnyMySqlInsert, TDynamic extends boolean, K extends keyof T & string> = TDynamic extends true ? T : Omit<MySqlInsertBase<T['_']['table'], T['_']['queryResult'], T['_']['preparedQueryHKT'], T['_']['returning'], TDynamic, T['_']['excludedMethods'] | '$returning'>, T['_']['excludedMethods'] | K>;
  47. export type MySqlInsertDynamic<T extends AnyMySqlInsert> = MySqlInsert<T['_']['table'], T['_']['queryResult'], T['_']['preparedQueryHKT'], T['_']['returning']>;
  48. export type MySqlInsertPrepare<T extends AnyMySqlInsert, TReturning extends Record<string, unknown> | undefined = undefined> = PreparedQueryKind<T['_']['preparedQueryHKT'], MySqlPreparedQueryConfig & {
  49. execute: TReturning extends undefined ? MySqlQueryResultKind<T['_']['queryResult'], never> : TReturning[];
  50. iterator: never;
  51. }, true>;
  52. export type MySqlInsertOnDuplicateKeyUpdateConfig<T extends AnyMySqlInsert> = {
  53. set: MySqlUpdateSetSource<T['_']['table']>;
  54. };
  55. export type MySqlInsert<TTable extends MySqlTable = MySqlTable, TQueryResult extends MySqlQueryResultHKT = AnyMySqlQueryResultHKT, TPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase, TReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined> = MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TReturning, true, never>;
  56. export type MySqlInsertReturning<T extends AnyMySqlInsert, TDynamic extends boolean> = MySqlInsertBase<T['_']['table'], T['_']['queryResult'], T['_']['preparedQueryHKT'], InferModelFromColumns<GetPrimarySerialOrDefaultKeys<T['_']['table']['_']['columns']>>, TDynamic, T['_']['excludedMethods'] | '$returning'>;
  57. export type AnyMySqlInsert = MySqlInsertBase<any, any, any, any, any, any>;
  58. export interface MySqlInsertBase<TTable extends MySqlTable, TQueryResult extends MySqlQueryResultHKT, TPreparedQueryHKT extends PreparedQueryHKTBase, TReturning extends Record<string, unknown> | undefined = undefined, TDynamic extends boolean = false, TExcludedMethods extends string = never> extends QueryPromise<TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[]>, RunnableQuery<TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[], 'mysql'>, SQLWrapper {
  59. readonly _: {
  60. readonly dialect: 'mysql';
  61. readonly table: TTable;
  62. readonly queryResult: TQueryResult;
  63. readonly preparedQueryHKT: TPreparedQueryHKT;
  64. readonly dynamic: TDynamic;
  65. readonly excludedMethods: TExcludedMethods;
  66. readonly returning: TReturning;
  67. readonly result: TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[];
  68. };
  69. }
  70. export type PrimaryKeyKeys<T extends Record<string, AnyMySqlColumn>> = {
  71. [K in keyof T]: T[K]['_']['isPrimaryKey'] extends true ? T[K]['_']['isAutoincrement'] extends true ? K : T[K]['_']['hasRuntimeDefault'] extends true ? T[K]['_']['isPrimaryKey'] extends true ? K : never : never : T[K]['_']['hasRuntimeDefault'] extends true ? T[K]['_']['isPrimaryKey'] extends true ? K : never : never;
  72. }[keyof T];
  73. export type GetPrimarySerialOrDefaultKeys<T extends Record<string, AnyMySqlColumn>> = {
  74. [K in PrimaryKeyKeys<T>]: T[K];
  75. };
  76. export declare class MySqlInsertBase<TTable extends MySqlTable, TQueryResult extends MySqlQueryResultHKT, TPreparedQueryHKT extends PreparedQueryHKTBase, TReturning extends Record<string, unknown> | undefined = undefined, TDynamic extends boolean = false, TExcludedMethods extends string = never> extends QueryPromise<TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[]> implements RunnableQuery<TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[], 'mysql'>, SQLWrapper {
  77. private session;
  78. private dialect;
  79. static readonly [entityKind]: string;
  80. protected $table: TTable;
  81. private config;
  82. protected cacheConfig?: WithCacheConfig;
  83. constructor(table: TTable, values: MySqlInsertConfig['values'], ignore: boolean, session: MySqlSession, dialect: MySqlDialect, select?: boolean);
  84. /**
  85. * Adds an `on duplicate key update` clause to the query.
  86. *
  87. * Calling this method will update the row if any unique index conflicts. MySQL will automatically determine the conflict target based on the primary key and unique indexes.
  88. *
  89. * See docs: {@link https://orm.drizzle.team/docs/insert#on-duplicate-key-update}
  90. *
  91. * @param config The `set` clause
  92. *
  93. * @example
  94. * ```ts
  95. * await db.insert(cars)
  96. * .values({ id: 1, brand: 'BMW'})
  97. * .onDuplicateKeyUpdate({ set: { brand: 'Porsche' }});
  98. * ```
  99. *
  100. * While MySQL does not directly support doing nothing on conflict, you can perform a no-op by setting any column's value to itself and achieve the same effect:
  101. *
  102. * ```ts
  103. * import { sql } from 'drizzle-orm';
  104. *
  105. * await db.insert(cars)
  106. * .values({ id: 1, brand: 'BMW' })
  107. * .onDuplicateKeyUpdate({ set: { id: sql`id` } });
  108. * ```
  109. */
  110. onDuplicateKeyUpdate(config: MySqlInsertOnDuplicateKeyUpdateConfig<this>): MySqlInsertWithout<this, TDynamic, 'onDuplicateKeyUpdate'>;
  111. $returningId(): MySqlInsertWithout<MySqlInsertReturning<this, TDynamic>, TDynamic, '$returningId'>;
  112. toSQL(): Query;
  113. prepare(): MySqlInsertPrepare<this, TReturning>;
  114. execute: ReturnType<this['prepare']>['execute'];
  115. private createIterator;
  116. iterator: ReturnType<this["prepare"]>["iterator"];
  117. $dynamic(): MySqlInsertDynamic<this>;
  118. }