ts-prorm-orm 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1111 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/dist/audit/history-query.js +180 -0
- package/dist/audit/index.js +23 -0
- package/dist/audit/logger.js +236 -0
- package/dist/cache/cache-manager.js +84 -0
- package/dist/cache/index.js +16 -0
- package/dist/cache/redis-cluster-cache.js +557 -0
- package/dist/cli.js +2200 -0
- package/dist/compliance/audit-trail.js +68 -0
- package/dist/compliance/backup-verification.js +685 -0
- package/dist/compliance/breach-detector.js +505 -0
- package/dist/compliance/consent-record.js +227 -0
- package/dist/compliance/consent-versioning.js +331 -0
- package/dist/compliance/cross-border-log.js +530 -0
- package/dist/compliance/data-classifier.js +258 -0
- package/dist/compliance/data-lineage.js +565 -0
- package/dist/compliance/data-masker.js +303 -0
- package/dist/compliance/data-portability.js +265 -0
- package/dist/compliance/data-retention.js +195 -0
- package/dist/compliance/dsar-workflow.js +342 -0
- package/dist/compliance/field-encryption.js +223 -0
- package/dist/compliance/immutable-record.js +148 -0
- package/dist/compliance/index.js +260 -0
- package/dist/compliance/privacy-impact-assessment.js +364 -0
- package/dist/compliance/pseudonymization.js +269 -0
- package/dist/compliance/query-firewall.js +1182 -0
- package/dist/compliance/rate-limiter.js +580 -0
- package/dist/compliance/right-to-erasure.js +117 -0
- package/dist/compliance/row-level-security.js +246 -0
- package/dist/compliance/security-decorator.js +574 -0
- package/dist/compliance/security-monitor.js +525 -0
- package/dist/compliance/sensitive-data-discovery.js +476 -0
- package/dist/compliance/session-isolation.js +472 -0
- package/dist/compliance/tls-enforcer.js +108 -0
- package/dist/compliance/worm-storage.js +712 -0
- package/dist/connection-manager.js +198 -0
- package/dist/connection-pool.js +519 -0
- package/dist/decorators/audit.js +136 -0
- package/dist/decorators/belongs-to-many.js +115 -0
- package/dist/decorators/belongs-to.js +115 -0
- package/dist/decorators/check.js +435 -0
- package/dist/decorators/collate.js +329 -0
- package/dist/decorators/comment.js +205 -0
- package/dist/decorators/database-settings.js +236 -0
- package/dist/decorators/default.js +244 -0
- package/dist/decorators/encryption.js +235 -0
- package/dist/decorators/engine.js +97 -0
- package/dist/decorators/fk-constraints.js +594 -0
- package/dist/decorators/foreign-table.js +136 -0
- package/dist/decorators/generated.js +274 -0
- package/dist/decorators/has-many.js +127 -0
- package/dist/decorators/has-one.js +116 -0
- package/dist/decorators/hstore.js +129 -0
- package/dist/decorators/index.js +355 -0
- package/dist/decorators/json-column.js +83 -0
- package/dist/decorators/jsonb.js +101 -0
- package/dist/decorators/orm-decorators.js +425 -0
- package/dist/decorators/permissions.js +294 -0
- package/dist/decorators/procedure.js +210 -0
- package/dist/decorators/query-options.js +556 -0
- package/dist/decorators/range.js +167 -0
- package/dist/decorators/set-column.js +83 -0
- package/dist/decorators/spatial.js +114 -0
- package/dist/decorators/storage.js +580 -0
- package/dist/decorators/timezone.js +512 -0
- package/dist/decorators/trigger.js +90 -0
- package/dist/decorators/uuid.js +135 -0
- package/dist/decorators/view.js +258 -0
- package/dist/diagrams/chen-diagram.js +354 -0
- package/dist/diagrams/class-diagram.js +384 -0
- package/dist/diagrams/dependency-diagram.js +432 -0
- package/dist/diagrams/er-diagram.js +605 -0
- package/dist/diagrams/flow-diagram.js +394 -0
- package/dist/diagrams/gantt-diagram.js +411 -0
- package/dist/diagrams/index-diagram.js +353 -0
- package/dist/diagrams/index.js +184 -0
- package/dist/diagrams/migration-diagram.js +316 -0
- package/dist/diagrams/model-diagram.js +616 -0
- package/dist/diagrams/package-diagram.js +376 -0
- package/dist/diagrams/palette.js +85 -0
- package/dist/diagrams/relational-diagram.js +455 -0
- package/dist/diagrams/schemadoc-diagram.js +309 -0
- package/dist/diagrams/sequence-diagram.js +307 -0
- package/dist/diagrams/state-diagram.js +344 -0
- package/dist/diagrams/svg-dom.js +111 -0
- package/dist/diagrams/tree-diagram.js +250 -0
- package/dist/dialects/clickhouse/index.js +1742 -0
- package/dist/dialects/cockroachdb/index.js +4677 -0
- package/dist/dialects/cratedb/index.js +441 -0
- package/dist/dialects/databricks/index.js +517 -0
- package/dist/dialects/db2/index.js +2225 -0
- package/dist/dialects/dialect.js +720 -0
- package/dist/dialects/duckdb/index.js +2014 -0
- package/dist/dialects/exasol/index.js +357 -0
- package/dist/dialects/firebird/index.js +495 -0
- package/dist/dialects/greenplum/index.js +457 -0
- package/dist/dialects/hana/index.js +1741 -0
- package/dist/dialects/mariadb/index.js +3590 -0
- package/dist/dialects/mssql/index.js +2296 -0
- package/dist/dialects/mysql/index.js +4058 -0
- package/dist/dialects/oracle/index.js +2999 -0
- package/dist/dialects/postgres/index.js +5319 -0
- package/dist/dialects/query-stream-helper.js +152 -0
- package/dist/dialects/questdb/index.js +433 -0
- package/dist/dialects/redshift/index.js +2277 -0
- package/dist/dialects/singlestore/index.js +354 -0
- package/dist/dialects/snowflake/index.js +2082 -0
- package/dist/dialects/spanner/index.js +1768 -0
- package/dist/dialects/sqlite/index.js +3382 -0
- package/dist/dialects/tidb/index.js +377 -0
- package/dist/dialects/timescaledb/index.js +164 -0
- package/dist/dialects/trino/index.js +420 -0
- package/dist/dialects/turso/index.js +227 -0
- package/dist/dialects/vertica/index.js +317 -0
- package/dist/dialects/yugabytedb/index.js +424 -0
- package/dist/errors/index.js +472 -0
- package/dist/errors/utils.js +340 -0
- package/dist/errors.js +21 -0
- package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
- package/dist/extensions/catalog/mssql-features.js +147 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
- package/dist/extensions/catalog/oracle-db2-features.js +196 -0
- package/dist/extensions/catalog/postgres-extensions.js +516 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/types.js +13 -0
- package/dist/foreign-data.js +173 -0
- package/dist/hooks/hooks-manager.js +350 -0
- package/dist/hooks/index.js +37 -0
- package/dist/index.js +463 -0
- package/dist/logging.js +335 -0
- package/dist/migrations/index.js +40 -0
- package/dist/migrations/migration.js +196 -0
- package/dist/migrations/migrator.js +411 -0
- package/dist/migrations/prormmigration.js +275 -0
- package/dist/migrations/query-interface.js +435 -0
- package/dist/migrations/seeder.js +353 -0
- package/dist/models/associations.js +852 -0
- package/dist/models/constraints.js +288 -0
- package/dist/models/data-types.js +2518 -0
- package/dist/models/decorators.js +445 -0
- package/dist/models/index.js +33 -0
- package/dist/models/indexes.js +531 -0
- package/dist/models/methods.js +382 -0
- package/dist/models/model-manager.js +103 -0
- package/dist/models/model.js +5349 -0
- package/dist/models/operators.js +67 -0
- package/dist/models/scopes.js +189 -0
- package/dist/models/typescript-types.js +26 -0
- package/dist/nosql/aerospike/index.js +205 -0
- package/dist/nosql/allegrograph/index.js +169 -0
- package/dist/nosql/arangodb/index.js +364 -0
- package/dist/nosql/azure-blob/index.js +206 -0
- package/dist/nosql/beanstalkd/index.js +231 -0
- package/dist/nosql/beequeue/index.js +210 -0
- package/dist/nosql/bigchaindb/index.js +195 -0
- package/dist/nosql/bigtable/index.js +224 -0
- package/dist/nosql/blazegraph/index.js +173 -0
- package/dist/nosql/bullmq/index.js +191 -0
- package/dist/nosql/cassandra/index.js +174 -0
- package/dist/nosql/chroma/index.js +190 -0
- package/dist/nosql/cloudflare-kv/index.js +220 -0
- package/dist/nosql/coherence/index.js +200 -0
- package/dist/nosql/cosmosdb/index.js +157 -0
- package/dist/nosql/couchbase/index.js +213 -0
- package/dist/nosql/dax/index.js +212 -0
- package/dist/nosql/deno-kv/index.js +206 -0
- package/dist/nosql/dgraph/index.js +171 -0
- package/dist/nosql/doris/index.js +169 -0
- package/dist/nosql/druid/index.js +162 -0
- package/dist/nosql/dynamodb/index.js +937 -0
- package/dist/nosql/elasticsearch/index.js +377 -0
- package/dist/nosql/etcd/index.js +502 -0
- package/dist/nosql/eventhubs/index.js +213 -0
- package/dist/nosql/eventstore/index.js +254 -0
- package/dist/nosql/faunadb/index.js +188 -0
- package/dist/nosql/firestore/index.js +177 -0
- package/dist/nosql/fluree/index.js +148 -0
- package/dist/nosql/fuseki/index.js +170 -0
- package/dist/nosql/gcs/index.js +172 -0
- package/dist/nosql/gearman/index.js +160 -0
- package/dist/nosql/geode/index.js +196 -0
- package/dist/nosql/graphdb/index.js +169 -0
- package/dist/nosql/graylog/index.js +188 -0
- package/dist/nosql/gridgain/index.js +171 -0
- package/dist/nosql/hazelcast/index.js +162 -0
- package/dist/nosql/hbase/index.js +230 -0
- package/dist/nosql/ignite/index.js +173 -0
- package/dist/nosql/immudb/index.js +184 -0
- package/dist/nosql/index.js +232 -0
- package/dist/nosql/infinispan/index.js +200 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.js +234 -0
- package/dist/nosql/keyspaces/index.js +189 -0
- package/dist/nosql/kinesis/index.js +253 -0
- package/dist/nosql/leveldb/index.js +153 -0
- package/dist/nosql/lmdb/index.js +160 -0
- package/dist/nosql/loki/index.js +201 -0
- package/dist/nosql/marklogic/index.js +204 -0
- package/dist/nosql/materialize/index.js +145 -0
- package/dist/nosql/meilisearch/index.js +154 -0
- package/dist/nosql/memcached/index.js +223 -0
- package/dist/nosql/milvus/index.js +410 -0
- package/dist/nosql/minio/index.js +265 -0
- package/dist/nosql/momento/index.js +179 -0
- package/dist/nosql/mongodb/index.js +461 -0
- package/dist/nosql/nats/index.js +247 -0
- package/dist/nosql/nedb/index.js +164 -0
- package/dist/nosql/neo4j/index.js +450 -0
- package/dist/nosql/neptune/index.js +470 -0
- package/dist/nosql/nsq/index.js +200 -0
- package/dist/nosql/opensearch/index.js +186 -0
- package/dist/nosql/orientdb/index.js +175 -0
- package/dist/nosql/papertrail/index.js +200 -0
- package/dist/nosql/pinecone/index.js +0 -0
- package/dist/nosql/pinot/index.js +133 -0
- package/dist/nosql/pouchdb/index.js +172 -0
- package/dist/nosql/prometheus/index.js +174 -0
- package/dist/nosql/provendb/index.js +147 -0
- package/dist/nosql/pubsub/index.js +187 -0
- package/dist/nosql/pulsar/index.js +232 -0
- package/dist/nosql/qdrant/index.js +295 -0
- package/dist/nosql/qldb/index.js +192 -0
- package/dist/nosql/r2/index.js +281 -0
- package/dist/nosql/rabbitmq/index.js +237 -0
- package/dist/nosql/ravendb/index.js +175 -0
- package/dist/nosql/redis/index.js +607 -0
- package/dist/nosql/redpanda/index.js +237 -0
- package/dist/nosql/resque/index.js +203 -0
- package/dist/nosql/rethinkdb/index.js +232 -0
- package/dist/nosql/rocksdb/index.js +152 -0
- package/dist/nosql/rockset/index.js +126 -0
- package/dist/nosql/s3/index.js +298 -0
- package/dist/nosql/scylladb/index.js +178 -0
- package/dist/nosql/signoz/index.js +227 -0
- package/dist/nosql/sns/index.js +201 -0
- package/dist/nosql/solr/index.js +231 -0
- package/dist/nosql/splunk/index.js +227 -0
- package/dist/nosql/sqs/index.js +246 -0
- package/dist/nosql/stardog/index.js +169 -0
- package/dist/nosql/starrocks/index.js +170 -0
- package/dist/nosql/store.js +2 -0
- package/dist/nosql/sumologic/index.js +213 -0
- package/dist/nosql/surrealdb/index.js +179 -0
- package/dist/nosql/terminusdb/index.js +151 -0
- package/dist/nosql/tigergraph/index.js +469 -0
- package/dist/nosql/typesense/index.js +148 -0
- package/dist/nosql/unqlite/index.js +157 -0
- package/dist/nosql/upstash/index.js +167 -0
- package/dist/nosql/vercel-kv/index.js +166 -0
- package/dist/nosql/victoriametrics/index.js +213 -0
- package/dist/nosql/virtuoso/index.js +169 -0
- package/dist/nosql/weaviate/index.js +276 -0
- package/dist/operators/index.js +108 -0
- package/dist/operators.js +2690 -0
- package/dist/prisma-migrate/index.js +38 -0
- package/dist/prisma-migrate/migration-generator.js +125 -0
- package/dist/prisma-migrate/model-generator.js +172 -0
- package/dist/prisma-migrate/relations.js +100 -0
- package/dist/prisma-migrate/schema-parser.js +167 -0
- package/dist/prisma-migrate/type-mapper.js +40 -0
- package/dist/prorm.js +6832 -0
- package/dist/query-builders/cte-builder.js +80 -0
- package/dist/query-builders/functions/aggregate.js +390 -0
- package/dist/query-builders/functions/conditional.js +503 -0
- package/dist/query-builders/functions/datetime.js +695 -0
- package/dist/query-builders/functions/fulltext.js +439 -0
- package/dist/query-builders/functions/index.js +93 -0
- package/dist/query-builders/functions/json.js +427 -0
- package/dist/query-builders/functions/math.js +399 -0
- package/dist/query-builders/functions/string.js +518 -0
- package/dist/query-builders/functions/window.js +328 -0
- package/dist/query-builders/include-builder.js +323 -0
- package/dist/query-builders/index-expression-builder.js +242 -0
- package/dist/query-builders/index.js +161 -0
- package/dist/query-builders/insert-builder.js +164 -0
- package/dist/query-builders/model-helpers.js +38 -0
- package/dist/query-builders/order-limit-builder.js +239 -0
- package/dist/query-builders/sql-compiler.js +2040 -0
- package/dist/query-builders/subquery-builder.js +152 -0
- package/dist/query-builders/update-builder.js +182 -0
- package/dist/query-builders/view-builder.js +218 -0
- package/dist/query-builders/where-builder.js +1532 -0
- package/dist/query-interface.js +622 -0
- package/dist/query-optimizers/batch-optimizer.js +426 -0
- package/dist/query-optimizers/explain-plans.js +415 -0
- package/dist/query-optimizers/index.js +51 -0
- package/dist/query-optimizers/prepared-statement-cache.js +423 -0
- package/dist/query-optimizers/query-hints.js +438 -0
- package/dist/query-optimizers/query-optimizer.js +278 -0
- package/dist/query-optimizers/slow-query-logger.js +271 -0
- package/dist/replica-manager.js +507 -0
- package/dist/schema/index.js +15 -0
- package/dist/schema/migration-generator.js +374 -0
- package/dist/schema/schema-differ.js +549 -0
- package/dist/schema/types.js +6 -0
- package/dist/sql-constants.js +300 -0
- package/dist/sqlite-advanced.js +1047 -0
- package/dist/streams/index.js +12 -0
- package/dist/streams/transforms.js +178 -0
- package/dist/transaction.js +456 -0
- package/dist/types/index.js +180 -0
- package/dist/user-management.js +127 -0
- package/dist/utils/date.js +300 -0
- package/dist/utils/index.js +1079 -0
- package/dist/utils/string.js +161 -0
- package/dist/validators/index.js +19 -0
- package/dist/validators/validator.js +911 -0
- package/package.json +190 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* QueryInterface for migrations
|
|
4
|
+
* Provides methods for schema modifications during migrations
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.QueryInterface = void 0;
|
|
8
|
+
exports.createQueryInterface = createQueryInterface;
|
|
9
|
+
/**
|
|
10
|
+
* QueryInterface class for migrations
|
|
11
|
+
* Provides a unified API for schema modifications across dialects
|
|
12
|
+
*/
|
|
13
|
+
class QueryInterface {
|
|
14
|
+
/**
|
|
15
|
+
* Create a new QueryInterface instance
|
|
16
|
+
* @param dialect - The database dialect to use
|
|
17
|
+
*/
|
|
18
|
+
constructor(dialect) {
|
|
19
|
+
this.transaction = null;
|
|
20
|
+
this.dialect = dialect;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Set the current transaction
|
|
24
|
+
*/
|
|
25
|
+
setTransaction(transaction) {
|
|
26
|
+
this.transaction = transaction;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get the current transaction
|
|
30
|
+
*/
|
|
31
|
+
getTransaction() {
|
|
32
|
+
return this.transaction;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the underlying dialect
|
|
36
|
+
*/
|
|
37
|
+
getDialect() {
|
|
38
|
+
return this.dialect;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a new table
|
|
42
|
+
* @param tableName - Name of the table to create
|
|
43
|
+
* @param columns - Column definitions
|
|
44
|
+
* @param options - Table options
|
|
45
|
+
*/
|
|
46
|
+
async createTable(tableName, columns, options) {
|
|
47
|
+
await this.dialect.createTable(tableName, columns, options);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Drop a table
|
|
51
|
+
* @param tableName - Name of the table to drop
|
|
52
|
+
* @param options - Drop options
|
|
53
|
+
*/
|
|
54
|
+
async dropTable(tableName, options) {
|
|
55
|
+
await this.dialect.dropTable(tableName, options);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Drop all tables (dialect-specific)
|
|
59
|
+
*/
|
|
60
|
+
async dropAllTables(_options) {
|
|
61
|
+
const tables = await this.showTables();
|
|
62
|
+
for (const table of tables) {
|
|
63
|
+
await this.dropTable(table);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Rename a table
|
|
68
|
+
* @param oldName - Current table name
|
|
69
|
+
* @param newName - New table name
|
|
70
|
+
*/
|
|
71
|
+
async renameTable(oldName, newName) {
|
|
72
|
+
await this.dialect.renameTable(oldName, newName);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Show all tables in the database
|
|
76
|
+
*/
|
|
77
|
+
async showTables() {
|
|
78
|
+
return this.dialect.showTables();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Describe a table (get column information)
|
|
82
|
+
* @param tableName - Name of the table to describe
|
|
83
|
+
*/
|
|
84
|
+
async describeTable(tableName) {
|
|
85
|
+
const description = await this.dialect.describeTable(tableName);
|
|
86
|
+
return description;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Add a column to a table
|
|
90
|
+
* @param tableName - Name of the table
|
|
91
|
+
* @param columnName - Name of the new column
|
|
92
|
+
* @param definition - Column definition
|
|
93
|
+
*/
|
|
94
|
+
async addColumn(tableName, columnName, definition) {
|
|
95
|
+
await this.dialect.addColumn(tableName, columnName, definition);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Remove a column from a table
|
|
99
|
+
* @param tableName - Name of the table
|
|
100
|
+
* @param columnName - Name of the column to remove
|
|
101
|
+
*/
|
|
102
|
+
async removeColumn(tableName, columnName) {
|
|
103
|
+
await this.dialect.removeColumn(tableName, columnName);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Change a column definition
|
|
107
|
+
* @param tableName - Name of the table
|
|
108
|
+
* @param columnName - Name of the column to change
|
|
109
|
+
* @param definition - New column definition
|
|
110
|
+
*/
|
|
111
|
+
async changeColumn(tableName, columnName, definition) {
|
|
112
|
+
await this.dialect.changeColumn(tableName, columnName, definition);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Rename a column
|
|
116
|
+
* @param tableName - Name of the table
|
|
117
|
+
* @param oldColumnName - Current column name
|
|
118
|
+
* @param newColumnName - New column name
|
|
119
|
+
*/
|
|
120
|
+
async renameColumn(tableName, oldColumnName, newColumnName) {
|
|
121
|
+
// Get current column definition
|
|
122
|
+
const description = await this.describeTable(tableName);
|
|
123
|
+
const columnDef = description[oldColumnName];
|
|
124
|
+
if (!columnDef) {
|
|
125
|
+
throw new Error(`Column ${oldColumnName} does not exist in table ${tableName}`);
|
|
126
|
+
}
|
|
127
|
+
// Add new column with new name
|
|
128
|
+
await this.addColumn(tableName, newColumnName, {
|
|
129
|
+
type: columnDef.type,
|
|
130
|
+
allowNull: columnDef.allowNull,
|
|
131
|
+
defaultValue: columnDef.defaultValue,
|
|
132
|
+
});
|
|
133
|
+
// Copy data from old column
|
|
134
|
+
await this.prormQuery(`UPDATE ${this.dialect.escapeId(tableName)} SET ${this.dialect.escapeId(newColumnName)} = ${this.dialect.escapeId(oldColumnName)}`);
|
|
135
|
+
// Remove old column
|
|
136
|
+
await this.removeColumn(tableName, oldColumnName);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Add an index to a table
|
|
140
|
+
* @param tableName - Name of the table
|
|
141
|
+
* @param indexName - Name of the index
|
|
142
|
+
* @param fields - Fields to index
|
|
143
|
+
* @param options - Index options
|
|
144
|
+
*/
|
|
145
|
+
async addIndex(tableName, indexName, fields, options) {
|
|
146
|
+
await this.dialect.addIndex(tableName, indexName, fields, options);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Remove an index from a table
|
|
150
|
+
* @param tableName - Name of the table
|
|
151
|
+
* @param indexName - Name of the index
|
|
152
|
+
*/
|
|
153
|
+
async removeIndex(tableName, indexName) {
|
|
154
|
+
await this.dialect.removeIndex(tableName, indexName);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Show indexes for a table
|
|
158
|
+
* @param tableName - Name of the table
|
|
159
|
+
*/
|
|
160
|
+
async showIndexes(tableName) {
|
|
161
|
+
// Delegate to the dialect so each database uses its own system-table query
|
|
162
|
+
// (SQLite PRAGMA, Postgres pg_indexes, MySQL SHOW INDEX, etc.) instead of
|
|
163
|
+
// hardcoding sqlite_master.
|
|
164
|
+
const indexes = await this.dialect.showIndexes(tableName);
|
|
165
|
+
return indexes.map((idx) => ({
|
|
166
|
+
name: idx.name,
|
|
167
|
+
unique: idx.unique ?? false,
|
|
168
|
+
fields: idx.fields ?? [],
|
|
169
|
+
type: idx.type,
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Add a constraint to a table
|
|
174
|
+
* @param tableName - Name of the table
|
|
175
|
+
* @param constraintName - Name of the constraint
|
|
176
|
+
* @param constraintDefinition - Constraint definition
|
|
177
|
+
*/
|
|
178
|
+
async addConstraint(tableName, constraintName, constraintDefinition) {
|
|
179
|
+
// A UNIQUE constraint is portably expressed as a unique index, so keep the
|
|
180
|
+
// existing index-based path (round-trips with removeConstraint below).
|
|
181
|
+
if (constraintDefinition.type === 'unique') {
|
|
182
|
+
if (constraintDefinition.fields && constraintDefinition.fields.length > 0) {
|
|
183
|
+
await this.addIndex(tableName, constraintName, constraintDefinition.fields, {
|
|
184
|
+
unique: true,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// PRIMARY KEY / FOREIGN KEY / CHECK are delegated to the dialect's
|
|
190
|
+
// createConstraint, which actually applies the constraint (via ALTER TABLE
|
|
191
|
+
// ADD CONSTRAINT, or a table rebuild for SQLite) instead of silently
|
|
192
|
+
// succeeding. Unsupported cases surface as a clear dialect error.
|
|
193
|
+
const typeMap = {
|
|
194
|
+
primaryKey: 'PRIMARY KEY',
|
|
195
|
+
foreignKey: 'FOREIGN KEY',
|
|
196
|
+
check: 'CHECK',
|
|
197
|
+
};
|
|
198
|
+
const constraintDef = {
|
|
199
|
+
name: constraintName,
|
|
200
|
+
type: typeMap[constraintDefinition.type],
|
|
201
|
+
fields: constraintDefinition.fields,
|
|
202
|
+
};
|
|
203
|
+
if (constraintDefinition.references) {
|
|
204
|
+
const refFields = constraintDefinition.references.fields;
|
|
205
|
+
constraintDef.references = {
|
|
206
|
+
table: constraintDefinition.references.table,
|
|
207
|
+
// createConstraint accepts a single field or a composite array; pass the
|
|
208
|
+
// array through for composite keys.
|
|
209
|
+
field: (refFields.length === 1 ? refFields[0] : refFields),
|
|
210
|
+
onDelete: constraintDefinition.onDelete,
|
|
211
|
+
onUpdate: constraintDefinition.onUpdate,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
await this.dialect.createConstraint(tableName, constraintDef);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Remove a constraint from a table
|
|
218
|
+
* @param tableName - Name of the table
|
|
219
|
+
* @param constraintName - Name of the constraint
|
|
220
|
+
* @param constraintType - Type of constraint
|
|
221
|
+
*/
|
|
222
|
+
async removeConstraint(tableName, constraintName, constraintType) {
|
|
223
|
+
// UNIQUE constraints are created as unique indexes above, so drop the index.
|
|
224
|
+
if (constraintType === 'unique') {
|
|
225
|
+
await this.removeIndex(tableName, constraintName);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
// PRIMARY KEY / FOREIGN KEY / CHECK are delegated to the dialect's
|
|
229
|
+
// dropConstraint (ALTER TABLE DROP CONSTRAINT) instead of silently no-oping.
|
|
230
|
+
// Dialects that cannot drop constraints in place throw a clear error.
|
|
231
|
+
await this.dialect.dropConstraint(tableName, constraintName);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Bulk insert records into a table
|
|
235
|
+
* @param tableName - Name of the table
|
|
236
|
+
* @param records - Array of records to insert
|
|
237
|
+
*/
|
|
238
|
+
async bulkInsert(tableName, records) {
|
|
239
|
+
if (records.length === 0) {
|
|
240
|
+
return 0;
|
|
241
|
+
}
|
|
242
|
+
const columns = Object.keys(records[0]);
|
|
243
|
+
const values = records.map((record) => {
|
|
244
|
+
return columns.map((col) => this.dialect.escape(record[col])).join(', ');
|
|
245
|
+
});
|
|
246
|
+
const columnList = columns.map((col) => this.dialect.escapeId(col)).join(', ');
|
|
247
|
+
const valueList = values.map((v) => `(${v})`).join(',\n');
|
|
248
|
+
const sql = `INSERT INTO ${this.dialect.escapeId(tableName)} (${columnList}) VALUES ${valueList}`;
|
|
249
|
+
const result = await this.dialect.query(sql);
|
|
250
|
+
return result.rowCount;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Bulk update records in a table
|
|
254
|
+
* @param tableName - Name of the table
|
|
255
|
+
* @param values - Values to update
|
|
256
|
+
* @param where - Where conditions
|
|
257
|
+
*/
|
|
258
|
+
async bulkUpdate(tableName, values, where) {
|
|
259
|
+
const setClause = Object.entries(values)
|
|
260
|
+
.map(([key, value]) => `${this.dialect.escapeId(key)} = ${this.dialect.escape(value)}`)
|
|
261
|
+
.join(', ');
|
|
262
|
+
const whereClause = this.buildWhereClause(where);
|
|
263
|
+
const sql = `UPDATE ${this.dialect.escapeId(tableName)} SET ${setClause} ${whereClause.sql}`;
|
|
264
|
+
const result = await this.dialect.query(sql, { replacements: whereClause.values });
|
|
265
|
+
return result.rowCount;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Bulk delete records from a table
|
|
269
|
+
* @param tableName - Name of the table
|
|
270
|
+
* @param where - Where conditions
|
|
271
|
+
*/
|
|
272
|
+
async bulkDelete(tableName, where) {
|
|
273
|
+
const whereClause = this.buildWhereClause(where);
|
|
274
|
+
const sql = `DELETE FROM ${this.dialect.escapeId(tableName)} ${whereClause.sql}`;
|
|
275
|
+
const result = await this.dialect.query(sql, { replacements: whereClause.values });
|
|
276
|
+
return result.rowCount;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Check if a table exists
|
|
280
|
+
* @param tableName - Name of the table
|
|
281
|
+
*/
|
|
282
|
+
async tableExists(tableName) {
|
|
283
|
+
const tables = await this.showTables();
|
|
284
|
+
return tables.includes(tableName);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Check if a column exists
|
|
288
|
+
* @param tableName - Name of the table
|
|
289
|
+
* @param columnName - Name of the column
|
|
290
|
+
*/
|
|
291
|
+
async columnExists(tableName, columnName) {
|
|
292
|
+
const description = await this.describeTable(tableName);
|
|
293
|
+
return columnName in description;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Check if an index exists
|
|
297
|
+
* @param tableName - Name of the table
|
|
298
|
+
* @param indexName - Name of the index
|
|
299
|
+
*/
|
|
300
|
+
async indexExists(tableName, indexName) {
|
|
301
|
+
const indexes = await this.showIndexes(tableName);
|
|
302
|
+
return indexes.some((idx) => idx.name === indexName);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get all foreign keys for a table
|
|
306
|
+
* @param tableName - Name of the table
|
|
307
|
+
*/
|
|
308
|
+
async getForeignKeysForTable(tableName) {
|
|
309
|
+
// Simplified implementation
|
|
310
|
+
// Real implementation would query database-specific system tables
|
|
311
|
+
const description = await this.describeTable(tableName);
|
|
312
|
+
const foreignKeys = [];
|
|
313
|
+
for (const [columnName, columnDef] of Object.entries(description)) {
|
|
314
|
+
if (columnDef.references) {
|
|
315
|
+
foreignKeys.push({
|
|
316
|
+
name: `${tableName}_${columnName}_fkey`,
|
|
317
|
+
field: columnName,
|
|
318
|
+
references: columnDef.references,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return foreignKeys;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Remove foreign key
|
|
326
|
+
* @param tableName - Name of the table
|
|
327
|
+
* @param foreignKeyName - Name of the foreign key
|
|
328
|
+
*/
|
|
329
|
+
async removeForeignKey(tableName, foreignKeyName) {
|
|
330
|
+
// A foreign key is a named constraint, so delegate to the dialect's
|
|
331
|
+
// dropConstraint. This avoids emitting MySQL-only `DROP FOREIGN KEY`, which
|
|
332
|
+
// is invalid on Postgres and others that require `DROP CONSTRAINT`.
|
|
333
|
+
await this.dialect.dropConstraint(tableName, foreignKeyName);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Add foreign key
|
|
337
|
+
* @param tableName - Name of the table
|
|
338
|
+
* @param columnName - Name of the column
|
|
339
|
+
* @param references - Reference definition
|
|
340
|
+
*/
|
|
341
|
+
async addForeignKey(tableName, columnName, references, onDelete, onUpdate) {
|
|
342
|
+
let sql = `ALTER TABLE ${this.dialect.escapeId(tableName)} ADD CONSTRAINT `;
|
|
343
|
+
sql += `${this.dialect.escapeId(`${tableName}_${columnName}_fkey`)} `;
|
|
344
|
+
sql += `FOREIGN KEY (${this.dialect.escapeId(columnName)}) `;
|
|
345
|
+
sql += `REFERENCES ${this.dialect.escapeId(references.table)} (${this.dialect.escapeId(references.field)})`;
|
|
346
|
+
if (onDelete) {
|
|
347
|
+
sql += ` ON DELETE ${onDelete}`;
|
|
348
|
+
}
|
|
349
|
+
if (onUpdate) {
|
|
350
|
+
sql += ` ON UPDATE ${onUpdate}`;
|
|
351
|
+
}
|
|
352
|
+
await this.prormQuery(sql);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Create a partitioned table (PostgreSQL 10+)
|
|
356
|
+
* @param tableName - Name of the table to create
|
|
357
|
+
* @param columns - Column definitions
|
|
358
|
+
* @param options - Table options including partition configuration
|
|
359
|
+
*/
|
|
360
|
+
async createPartitionedTable(tableName, columns, options) {
|
|
361
|
+
await this.dialect.createPartitionedTable(tableName, columns, options);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Create a partition for an existing partitioned table (PostgreSQL 10+)
|
|
365
|
+
* @param options - Partition creation options
|
|
366
|
+
*/
|
|
367
|
+
async createPartition(options) {
|
|
368
|
+
await this.dialect.createPartition(options);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Attach a partition to a partitioned table (PostgreSQL 11+)
|
|
372
|
+
* @param options - Partition attachment options
|
|
373
|
+
*/
|
|
374
|
+
async attachPartition(options) {
|
|
375
|
+
await this.dialect.attachPartition(options);
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Detach a partition from a partitioned table (PostgreSQL 11+)
|
|
379
|
+
* @param options - Partition detachment options
|
|
380
|
+
*/
|
|
381
|
+
async detachPartition(options) {
|
|
382
|
+
await this.dialect.detachPartition(options);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Drop a partition (PostgreSQL 10+)
|
|
386
|
+
* @param partitionName - Name of the partition to drop
|
|
387
|
+
* @param options - Drop options
|
|
388
|
+
*/
|
|
389
|
+
async dropPartition(partitionName, options) {
|
|
390
|
+
await this.dialect.dropPartition(partitionName, options);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Execute a raw SQL query
|
|
394
|
+
* @param sql - SQL query
|
|
395
|
+
* @param options - Query options
|
|
396
|
+
*/
|
|
397
|
+
async prormQuery(sql, options) {
|
|
398
|
+
return this.dialect.query(sql, options);
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Get the database version
|
|
402
|
+
*/
|
|
403
|
+
async getDatabaseVersion() {
|
|
404
|
+
return this.dialect.getDatabaseVersion();
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Build a WHERE clause from WhereOptions
|
|
408
|
+
*/
|
|
409
|
+
buildWhereClause(where) {
|
|
410
|
+
const conditions = [];
|
|
411
|
+
const values = [];
|
|
412
|
+
for (const [key, value] of Object.entries(where)) {
|
|
413
|
+
if (value === null) {
|
|
414
|
+
conditions.push(`${this.dialect.escapeId(key)} IS NULL`);
|
|
415
|
+
}
|
|
416
|
+
else if (Array.isArray(value)) {
|
|
417
|
+
conditions.push(`${this.dialect.escapeId(key)} IN (${value.map(() => '?').join(', ')})`);
|
|
418
|
+
values.push(...value);
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
conditions.push(`${this.dialect.escapeId(key)} = ?`);
|
|
422
|
+
values.push(value);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
const sql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
426
|
+
return { sql, values };
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
exports.QueryInterface = QueryInterface;
|
|
430
|
+
/**
|
|
431
|
+
* Create a QueryInterface from a dialect
|
|
432
|
+
*/
|
|
433
|
+
function createQueryInterface(dialect) {
|
|
434
|
+
return new QueryInterface(dialect);
|
|
435
|
+
}
|