Initial commit
This commit is contained in:
332
node_modules/drizzle-orm/sqlite-core/db.js
generated
vendored
Normal file
332
node_modules/drizzle-orm/sqlite-core/db.js
generated
vendored
Normal file
@ -0,0 +1,332 @@
|
||||
import { entityKind } from "../entity.js";
|
||||
import { SelectionProxyHandler } from "../selection-proxy.js";
|
||||
import { sql } from "../sql/sql.js";
|
||||
import {
|
||||
QueryBuilder,
|
||||
SQLiteDeleteBase,
|
||||
SQLiteInsertBuilder,
|
||||
SQLiteSelectBuilder,
|
||||
SQLiteUpdateBuilder
|
||||
} from "./query-builders/index.js";
|
||||
import { WithSubquery } from "../subquery.js";
|
||||
import { SQLiteCountBuilder } from "./query-builders/count.js";
|
||||
import { RelationalQueryBuilder } from "./query-builders/query.js";
|
||||
import { SQLiteRaw } from "./query-builders/raw.js";
|
||||
class BaseSQLiteDatabase {
|
||||
constructor(resultKind, dialect, session, schema) {
|
||||
this.resultKind = resultKind;
|
||||
this.dialect = dialect;
|
||||
this.session = session;
|
||||
this._ = schema ? {
|
||||
schema: schema.schema,
|
||||
fullSchema: schema.fullSchema,
|
||||
tableNamesMap: schema.tableNamesMap
|
||||
} : {
|
||||
schema: void 0,
|
||||
fullSchema: {},
|
||||
tableNamesMap: {}
|
||||
};
|
||||
this.query = {};
|
||||
const query = this.query;
|
||||
if (this._.schema) {
|
||||
for (const [tableName, columns] of Object.entries(this._.schema)) {
|
||||
query[tableName] = new RelationalQueryBuilder(
|
||||
resultKind,
|
||||
schema.fullSchema,
|
||||
this._.schema,
|
||||
this._.tableNamesMap,
|
||||
schema.fullSchema[tableName],
|
||||
columns,
|
||||
dialect,
|
||||
session
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
static [entityKind] = "BaseSQLiteDatabase";
|
||||
query;
|
||||
/**
|
||||
* Creates a subquery that defines a temporary named result set as a CTE.
|
||||
*
|
||||
* It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.
|
||||
*
|
||||
* See docs: {@link https://orm.drizzle.team/docs/select#with-clause}
|
||||
*
|
||||
* @param alias The alias for the subquery.
|
||||
*
|
||||
* Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```ts
|
||||
* // Create a subquery with alias 'sq' and use it in the select query
|
||||
* const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));
|
||||
*
|
||||
* const result = await db.with(sq).select().from(sq);
|
||||
* ```
|
||||
*
|
||||
* To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:
|
||||
*
|
||||
* ```ts
|
||||
* // Select an arbitrary SQL value as a field in a CTE and reference it in the main query
|
||||
* const sq = db.$with('sq').as(db.select({
|
||||
* name: sql<string>`upper(${users.name})`.as('name'),
|
||||
* })
|
||||
* .from(users));
|
||||
*
|
||||
* const result = await db.with(sq).select({ name: sq.name }).from(sq);
|
||||
* ```
|
||||
*/
|
||||
$with(alias) {
|
||||
const self = this;
|
||||
return {
|
||||
as(qb) {
|
||||
if (typeof qb === "function") {
|
||||
qb = qb(new QueryBuilder(self.dialect));
|
||||
}
|
||||
return new Proxy(
|
||||
new WithSubquery(qb.getSQL(), qb.getSelectedFields(), alias, true),
|
||||
new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" })
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
$count(source, filters) {
|
||||
return new SQLiteCountBuilder({ source, filters, session: this.session });
|
||||
}
|
||||
/**
|
||||
* Incorporates a previously defined CTE (using `$with`) into the main query.
|
||||
*
|
||||
* This method allows the main query to reference a temporary named result set.
|
||||
*
|
||||
* See docs: {@link https://orm.drizzle.team/docs/select#with-clause}
|
||||
*
|
||||
* @param queries The CTEs to incorporate into the main query.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```ts
|
||||
* // Define a subquery 'sq' as a CTE using $with
|
||||
* const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));
|
||||
*
|
||||
* // Incorporate the CTE 'sq' into the main query and select from it
|
||||
* const result = await db.with(sq).select().from(sq);
|
||||
* ```
|
||||
*/
|
||||
with(...queries) {
|
||||
const self = this;
|
||||
function select(fields) {
|
||||
return new SQLiteSelectBuilder({
|
||||
fields: fields ?? void 0,
|
||||
session: self.session,
|
||||
dialect: self.dialect,
|
||||
withList: queries
|
||||
});
|
||||
}
|
||||
function selectDistinct(fields) {
|
||||
return new SQLiteSelectBuilder({
|
||||
fields: fields ?? void 0,
|
||||
session: self.session,
|
||||
dialect: self.dialect,
|
||||
withList: queries,
|
||||
distinct: true
|
||||
});
|
||||
}
|
||||
function update(table) {
|
||||
return new SQLiteUpdateBuilder(table, self.session, self.dialect, queries);
|
||||
}
|
||||
function insert(into) {
|
||||
return new SQLiteInsertBuilder(into, self.session, self.dialect, queries);
|
||||
}
|
||||
function delete_(from) {
|
||||
return new SQLiteDeleteBase(from, self.session, self.dialect, queries);
|
||||
}
|
||||
return { select, selectDistinct, update, insert, delete: delete_ };
|
||||
}
|
||||
select(fields) {
|
||||
return new SQLiteSelectBuilder({ fields: fields ?? void 0, session: this.session, dialect: this.dialect });
|
||||
}
|
||||
selectDistinct(fields) {
|
||||
return new SQLiteSelectBuilder({
|
||||
fields: fields ?? void 0,
|
||||
session: this.session,
|
||||
dialect: this.dialect,
|
||||
distinct: true
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Creates an update query.
|
||||
*
|
||||
* Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.
|
||||
*
|
||||
* Use `.set()` method to specify which values to update.
|
||||
*
|
||||
* See docs: {@link https://orm.drizzle.team/docs/update}
|
||||
*
|
||||
* @param table The table to update.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```ts
|
||||
* // Update all rows in the 'cars' table
|
||||
* await db.update(cars).set({ color: 'red' });
|
||||
*
|
||||
* // Update rows with filters and conditions
|
||||
* await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));
|
||||
*
|
||||
* // Update with returning clause
|
||||
* const updatedCar: Car[] = await db.update(cars)
|
||||
* .set({ color: 'red' })
|
||||
* .where(eq(cars.id, 1))
|
||||
* .returning();
|
||||
* ```
|
||||
*/
|
||||
update(table) {
|
||||
return new SQLiteUpdateBuilder(table, this.session, this.dialect);
|
||||
}
|
||||
/**
|
||||
* Creates an insert query.
|
||||
*
|
||||
* Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.
|
||||
*
|
||||
* See docs: {@link https://orm.drizzle.team/docs/insert}
|
||||
*
|
||||
* @param table The table to insert into.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```ts
|
||||
* // Insert one row
|
||||
* await db.insert(cars).values({ brand: 'BMW' });
|
||||
*
|
||||
* // Insert multiple rows
|
||||
* await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);
|
||||
*
|
||||
* // Insert with returning clause
|
||||
* const insertedCar: Car[] = await db.insert(cars)
|
||||
* .values({ brand: 'BMW' })
|
||||
* .returning();
|
||||
* ```
|
||||
*/
|
||||
insert(into) {
|
||||
return new SQLiteInsertBuilder(into, this.session, this.dialect);
|
||||
}
|
||||
/**
|
||||
* Creates a delete query.
|
||||
*
|
||||
* Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.
|
||||
*
|
||||
* See docs: {@link https://orm.drizzle.team/docs/delete}
|
||||
*
|
||||
* @param table The table to delete from.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```ts
|
||||
* // Delete all rows in the 'cars' table
|
||||
* await db.delete(cars);
|
||||
*
|
||||
* // Delete rows with filters and conditions
|
||||
* await db.delete(cars).where(eq(cars.color, 'green'));
|
||||
*
|
||||
* // Delete with returning clause
|
||||
* const deletedCar: Car[] = await db.delete(cars)
|
||||
* .where(eq(cars.id, 1))
|
||||
* .returning();
|
||||
* ```
|
||||
*/
|
||||
delete(from) {
|
||||
return new SQLiteDeleteBase(from, this.session, this.dialect);
|
||||
}
|
||||
run(query) {
|
||||
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
||||
if (this.resultKind === "async") {
|
||||
return new SQLiteRaw(
|
||||
async () => this.session.run(sequel),
|
||||
() => sequel,
|
||||
"run",
|
||||
this.dialect,
|
||||
this.session.extractRawRunValueFromBatchResult.bind(this.session)
|
||||
);
|
||||
}
|
||||
return this.session.run(sequel);
|
||||
}
|
||||
all(query) {
|
||||
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
||||
if (this.resultKind === "async") {
|
||||
return new SQLiteRaw(
|
||||
async () => this.session.all(sequel),
|
||||
() => sequel,
|
||||
"all",
|
||||
this.dialect,
|
||||
this.session.extractRawAllValueFromBatchResult.bind(this.session)
|
||||
);
|
||||
}
|
||||
return this.session.all(sequel);
|
||||
}
|
||||
get(query) {
|
||||
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
||||
if (this.resultKind === "async") {
|
||||
return new SQLiteRaw(
|
||||
async () => this.session.get(sequel),
|
||||
() => sequel,
|
||||
"get",
|
||||
this.dialect,
|
||||
this.session.extractRawGetValueFromBatchResult.bind(this.session)
|
||||
);
|
||||
}
|
||||
return this.session.get(sequel);
|
||||
}
|
||||
values(query) {
|
||||
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
||||
if (this.resultKind === "async") {
|
||||
return new SQLiteRaw(
|
||||
async () => this.session.values(sequel),
|
||||
() => sequel,
|
||||
"values",
|
||||
this.dialect,
|
||||
this.session.extractRawValuesValueFromBatchResult.bind(this.session)
|
||||
);
|
||||
}
|
||||
return this.session.values(sequel);
|
||||
}
|
||||
transaction(transaction, config) {
|
||||
return this.session.transaction(transaction, config);
|
||||
}
|
||||
}
|
||||
const withReplicas = (primary, replicas, getReplica = () => replicas[Math.floor(Math.random() * replicas.length)]) => {
|
||||
const select = (...args) => getReplica(replicas).select(...args);
|
||||
const selectDistinct = (...args) => getReplica(replicas).selectDistinct(...args);
|
||||
const $with = (...args) => getReplica(replicas).with(...args);
|
||||
const update = (...args) => primary.update(...args);
|
||||
const insert = (...args) => primary.insert(...args);
|
||||
const $delete = (...args) => primary.delete(...args);
|
||||
const run = (...args) => primary.run(...args);
|
||||
const all = (...args) => primary.all(...args);
|
||||
const get = (...args) => primary.get(...args);
|
||||
const values = (...args) => primary.values(...args);
|
||||
const transaction = (...args) => primary.transaction(...args);
|
||||
return {
|
||||
...primary,
|
||||
update,
|
||||
insert,
|
||||
delete: $delete,
|
||||
run,
|
||||
all,
|
||||
get,
|
||||
values,
|
||||
transaction,
|
||||
$primary: primary,
|
||||
select,
|
||||
selectDistinct,
|
||||
with: $with,
|
||||
get query() {
|
||||
return getReplica(replicas).query;
|
||||
}
|
||||
};
|
||||
};
|
||||
export {
|
||||
BaseSQLiteDatabase,
|
||||
withReplicas
|
||||
};
|
||||
//# sourceMappingURL=db.js.map
|
||||
Reference in New Issue
Block a user