@strapi/database 5.12.1 → 5.12.3
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/dist/connection.js +43 -0
- package/dist/connection.js.map +1 -0
- package/dist/connection.mjs +41 -0
- package/dist/connection.mjs.map +1 -0
- package/dist/dialects/dialect.js +54 -0
- package/dist/dialects/dialect.js.map +1 -0
- package/dist/dialects/dialect.mjs +52 -0
- package/dist/dialects/dialect.mjs.map +1 -0
- package/dist/dialects/index.js +44 -0
- package/dist/dialects/index.js.map +1 -0
- package/dist/dialects/index.mjs +42 -0
- package/dist/dialects/index.mjs.map +1 -0
- package/dist/dialects/mysql/constants.js +8 -0
- package/dist/dialects/mysql/constants.js.map +1 -0
- package/dist/dialects/mysql/constants.mjs +5 -0
- package/dist/dialects/mysql/constants.mjs.map +1 -0
- package/dist/dialects/mysql/database-inspector.js +35 -0
- package/dist/dialects/mysql/database-inspector.js.map +1 -0
- package/dist/dialects/mysql/database-inspector.mjs +33 -0
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
- package/dist/dialects/mysql/index.js +75 -0
- package/dist/dialects/mysql/index.js.map +1 -0
- package/dist/dialects/mysql/index.mjs +73 -0
- package/dist/dialects/mysql/index.mjs.map +1 -0
- package/dist/dialects/mysql/schema-inspector.js +297 -0
- package/dist/dialects/mysql/schema-inspector.js.map +1 -0
- package/dist/dialects/mysql/schema-inspector.mjs +295 -0
- package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/postgresql/index.js +62 -0
- package/dist/dialects/postgresql/index.js.map +1 -0
- package/dist/dialects/postgresql/index.mjs +60 -0
- package/dist/dialects/postgresql/index.mjs.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.js +316 -0
- package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
- package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/sqlite/index.js +82 -0
- package/dist/dialects/sqlite/index.js.map +1 -0
- package/dist/dialects/sqlite/index.mjs +80 -0
- package/dist/dialects/sqlite/index.mjs.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.js +211 -0
- package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
- package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
- package/dist/entity-manager/entity-repository.js +139 -0
- package/dist/entity-manager/entity-repository.js.map +1 -0
- package/dist/entity-manager/entity-repository.mjs +137 -0
- package/dist/entity-manager/entity-repository.mjs.map +1 -0
- package/dist/entity-manager/index.js +1186 -0
- package/dist/entity-manager/index.js.map +1 -0
- package/dist/entity-manager/index.mjs +1184 -0
- package/dist/entity-manager/index.mjs.map +1 -0
- package/dist/entity-manager/morph-relations.js +73 -0
- package/dist/entity-manager/morph-relations.js.map +1 -0
- package/dist/entity-manager/morph-relations.mjs +69 -0
- package/dist/entity-manager/morph-relations.mjs.map +1 -0
- package/dist/entity-manager/regular-relations.js +247 -0
- package/dist/entity-manager/regular-relations.js.map +1 -0
- package/dist/entity-manager/regular-relations.mjs +242 -0
- package/dist/entity-manager/regular-relations.mjs.map +1 -0
- package/dist/entity-manager/relations-orderer.js +221 -0
- package/dist/entity-manager/relations-orderer.js.map +1 -0
- package/dist/entity-manager/relations-orderer.mjs +218 -0
- package/dist/entity-manager/relations-orderer.mjs.map +1 -0
- package/dist/errors/database.js +13 -0
- package/dist/errors/database.js.map +1 -0
- package/dist/errors/database.mjs +11 -0
- package/dist/errors/database.mjs.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/index.mjs +7 -0
- package/dist/errors/index.mjs.map +1 -0
- package/dist/errors/invalid-date.js +13 -0
- package/dist/errors/invalid-date.js.map +1 -0
- package/dist/errors/invalid-date.mjs +11 -0
- package/dist/errors/invalid-date.mjs.map +1 -0
- package/dist/errors/invalid-datetime.js +13 -0
- package/dist/errors/invalid-datetime.js.map +1 -0
- package/dist/errors/invalid-datetime.mjs +11 -0
- package/dist/errors/invalid-datetime.mjs.map +1 -0
- package/dist/errors/invalid-relation.js +13 -0
- package/dist/errors/invalid-relation.js.map +1 -0
- package/dist/errors/invalid-relation.mjs +11 -0
- package/dist/errors/invalid-relation.mjs.map +1 -0
- package/dist/errors/invalid-time.js +13 -0
- package/dist/errors/invalid-time.js.map +1 -0
- package/dist/errors/invalid-time.mjs +11 -0
- package/dist/errors/invalid-time.mjs.map +1 -0
- package/dist/errors/not-null.js +17 -0
- package/dist/errors/not-null.js.map +1 -0
- package/dist/errors/not-null.mjs +15 -0
- package/dist/errors/not-null.mjs.map +1 -0
- package/dist/fields/biginteger.js +9 -0
- package/dist/fields/biginteger.js.map +1 -0
- package/dist/fields/biginteger.mjs +7 -0
- package/dist/fields/biginteger.mjs.map +1 -0
- package/dist/fields/boolean.js +48 -0
- package/dist/fields/boolean.js.map +1 -0
- package/dist/fields/boolean.mjs +46 -0
- package/dist/fields/boolean.mjs.map +1 -0
- package/dist/fields/date.js +16 -0
- package/dist/fields/date.js.map +1 -0
- package/dist/fields/date.mjs +14 -0
- package/dist/fields/date.mjs.map +1 -0
- package/dist/fields/datetime.js +37 -0
- package/dist/fields/datetime.js.map +1 -0
- package/dist/fields/datetime.mjs +16 -0
- package/dist/fields/datetime.mjs.map +1 -0
- package/dist/fields/field.js +16 -0
- package/dist/fields/field.js.map +1 -0
- package/dist/fields/field.mjs +14 -0
- package/dist/fields/field.mjs.map +1 -0
- package/dist/fields/index.js +45 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/index.mjs +43 -0
- package/dist/fields/index.mjs.map +1 -0
- package/dist/fields/json.js +36 -0
- package/dist/fields/json.js.map +1 -0
- package/dist/fields/json.mjs +34 -0
- package/dist/fields/json.mjs.map +1 -0
- package/dist/fields/number.js +20 -0
- package/dist/fields/number.js.map +1 -0
- package/dist/fields/number.mjs +18 -0
- package/dist/fields/number.mjs.map +1 -0
- package/dist/fields/shared/parsers.js +91 -0
- package/dist/fields/shared/parsers.js.map +1 -0
- package/dist/fields/shared/parsers.mjs +68 -0
- package/dist/fields/shared/parsers.mjs.map +1 -0
- package/dist/fields/string.js +16 -0
- package/dist/fields/string.js.map +1 -0
- package/dist/fields/string.mjs +14 -0
- package/dist/fields/string.mjs.map +1 -0
- package/dist/fields/time.js +17 -0
- package/dist/fields/time.js.map +1 -0
- package/dist/fields/time.mjs +15 -0
- package/dist/fields/time.mjs.map +1 -0
- package/dist/fields/timestamp.js +37 -0
- package/dist/fields/timestamp.js.map +1 -0
- package/dist/fields/timestamp.mjs +16 -0
- package/dist/fields/timestamp.mjs.map +1 -0
- package/dist/index.js +33 -8569
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -8532
- package/dist/index.mjs.map +1 -1
- package/dist/lifecycles/index.js +73 -0
- package/dist/lifecycles/index.js.map +1 -0
- package/dist/lifecycles/index.mjs +71 -0
- package/dist/lifecycles/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/index.js +10 -0
- package/dist/lifecycles/subscribers/index.js.map +1 -0
- package/dist/lifecycles/subscribers/index.mjs +8 -0
- package/dist/lifecycles/subscribers/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.js +55 -0
- package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
- package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
- package/dist/metadata/index.js +24 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/index.mjs +16 -0
- package/dist/metadata/index.mjs.map +1 -0
- package/dist/metadata/metadata.js +100 -0
- package/dist/metadata/metadata.js.map +1 -0
- package/dist/metadata/metadata.mjs +98 -0
- package/dist/metadata/metadata.mjs.map +1 -0
- package/dist/metadata/relations.js +545 -0
- package/dist/metadata/relations.js.map +1 -0
- package/dist/metadata/relations.mjs +536 -0
- package/dist/metadata/relations.mjs.map +1 -0
- package/dist/migrations/common.js +8 -0
- package/dist/migrations/common.js.map +1 -0
- package/dist/migrations/common.mjs +6 -0
- package/dist/migrations/common.mjs.map +1 -0
- package/dist/migrations/index.js +39 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/index.mjs +37 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/index.js +26 -0
- package/dist/migrations/internal-migrations/index.js.map +1 -0
- package/dist/migrations/internal-migrations/index.mjs +24 -0
- package/dist/migrations/internal-migrations/index.mjs.map +1 -0
- package/dist/migrations/internal.js +63 -0
- package/dist/migrations/internal.js.map +1 -0
- package/dist/migrations/internal.mjs +61 -0
- package/dist/migrations/internal.mjs.map +1 -0
- package/dist/migrations/logger.js +24 -0
- package/dist/migrations/logger.js.map +1 -0
- package/dist/migrations/logger.mjs +22 -0
- package/dist/migrations/logger.mjs.map +1 -0
- package/dist/migrations/storage.js +39 -0
- package/dist/migrations/storage.js.map +1 -0
- package/dist/migrations/storage.mjs +37 -0
- package/dist/migrations/storage.mjs.map +1 -0
- package/dist/migrations/users.js +87 -0
- package/dist/migrations/users.js.map +1 -0
- package/dist/migrations/users.mjs +85 -0
- package/dist/migrations/users.mjs.map +1 -0
- package/dist/query/helpers/join.js +127 -0
- package/dist/query/helpers/join.js.map +1 -0
- package/dist/query/helpers/join.mjs +122 -0
- package/dist/query/helpers/join.mjs.map +1 -0
- package/dist/query/helpers/order-by.js +167 -0
- package/dist/query/helpers/order-by.js.map +1 -0
- package/dist/query/helpers/order-by.mjs +163 -0
- package/dist/query/helpers/order-by.mjs.map +1 -0
- package/dist/query/helpers/populate/apply.js +592 -0
- package/dist/query/helpers/populate/apply.js.map +1 -0
- package/dist/query/helpers/populate/apply.mjs +590 -0
- package/dist/query/helpers/populate/apply.mjs.map +1 -0
- package/dist/query/helpers/populate/process.js +92 -0
- package/dist/query/helpers/populate/process.js.map +1 -0
- package/dist/query/helpers/populate/process.mjs +90 -0
- package/dist/query/helpers/populate/process.mjs.map +1 -0
- package/dist/query/helpers/search.js +67 -0
- package/dist/query/helpers/search.js.map +1 -0
- package/dist/query/helpers/search.mjs +65 -0
- package/dist/query/helpers/search.mjs.map +1 -0
- package/dist/query/helpers/streams/readable.js +131 -0
- package/dist/query/helpers/streams/readable.js.map +1 -0
- package/dist/query/helpers/streams/readable.mjs +129 -0
- package/dist/query/helpers/streams/readable.mjs.map +1 -0
- package/dist/query/helpers/transform.js +77 -0
- package/dist/query/helpers/transform.js.map +1 -0
- package/dist/query/helpers/transform.mjs +73 -0
- package/dist/query/helpers/transform.mjs.map +1 -0
- package/dist/query/helpers/where.js +372 -0
- package/dist/query/helpers/where.js.map +1 -0
- package/dist/query/helpers/where.mjs +369 -0
- package/dist/query/helpers/where.mjs.map +1 -0
- package/dist/query/query-builder.js +507 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-builder.mjs +505 -0
- package/dist/query/query-builder.mjs.map +1 -0
- package/dist/repairs/index.js +13 -0
- package/dist/repairs/index.js.map +1 -0
- package/dist/repairs/index.mjs +11 -0
- package/dist/repairs/index.mjs.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
- package/dist/schema/builder.js +354 -0
- package/dist/schema/builder.js.map +1 -0
- package/dist/schema/builder.mjs +352 -0
- package/dist/schema/builder.mjs.map +1 -0
- package/dist/schema/diff.js +379 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/diff.mjs +377 -0
- package/dist/schema/diff.mjs.map +1 -0
- package/dist/schema/index.js +93 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/index.mjs +91 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/schema/schema.js +266 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/schema.mjs +264 -0
- package/dist/schema/schema.mjs.map +1 -0
- package/dist/schema/storage.js +58 -0
- package/dist/schema/storage.js.map +1 -0
- package/dist/schema/storage.mjs +56 -0
- package/dist/schema/storage.mjs.map +1 -0
- package/dist/transaction-context.js +65 -0
- package/dist/transaction-context.js.map +1 -0
- package/dist/transaction-context.mjs +63 -0
- package/dist/transaction-context.mjs.map +1 -0
- package/dist/utils/async-curry.js +19 -0
- package/dist/utils/async-curry.js.map +1 -0
- package/dist/utils/async-curry.mjs +17 -0
- package/dist/utils/async-curry.mjs.map +1 -0
- package/dist/utils/identifiers/hash.js +30 -0
- package/dist/utils/identifiers/hash.js.map +1 -0
- package/dist/utils/identifiers/hash.mjs +28 -0
- package/dist/utils/identifiers/hash.mjs.map +1 -0
- package/dist/utils/identifiers/index.js +414 -0
- package/dist/utils/identifiers/index.js.map +1 -0
- package/dist/utils/identifiers/index.mjs +411 -0
- package/dist/utils/identifiers/index.mjs.map +1 -0
- package/dist/utils/knex.js +21 -0
- package/dist/utils/knex.js.map +1 -0
- package/dist/utils/knex.mjs +18 -0
- package/dist/utils/knex.mjs.map +1 -0
- package/dist/utils/types.js +51 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/types.mjs +44 -0
- package/dist/utils/types.mjs.map +1 -0
- package/dist/validations/index.js +12 -0
- package/dist/validations/index.js.map +1 -0
- package/dist/validations/index.mjs +10 -0
- package/dist/validations/index.mjs.map +1 -0
- package/dist/validations/relations/bidirectional.js +64 -0
- package/dist/validations/relations/bidirectional.js.map +1 -0
- package/dist/validations/relations/bidirectional.mjs +62 -0
- package/dist/validations/relations/bidirectional.mjs.map +1 -0
- package/dist/validations/relations/index.js +13 -0
- package/dist/validations/relations/index.js.map +1 -0
- package/dist/validations/relations/index.mjs +11 -0
- package/dist/validations/relations/index.mjs.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var notNull = require('../../errors/not-null.js');
|
|
4
|
+
var dialect = require('../dialect.js');
|
|
5
|
+
var schemaInspector = require('./schema-inspector.js');
|
|
6
|
+
|
|
7
|
+
class PostgresDialect extends dialect {
|
|
8
|
+
useReturning() {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
async initialize(nativeConnection) {
|
|
12
|
+
// Don't cast DATE string to Date()
|
|
13
|
+
this.db.connection.client.driver.types.setTypeParser(this.db.connection.client.driver.types.builtins.DATE, 'text', (v)=>v);
|
|
14
|
+
// Don't parse JSONB automatically
|
|
15
|
+
this.db.connection.client.driver.types.setTypeParser(this.db.connection.client.driver.types.builtins.JSONB, 'text', (v)=>v);
|
|
16
|
+
this.db.connection.client.driver.types.setTypeParser(this.db.connection.client.driver.types.builtins.NUMERIC, 'text', parseFloat);
|
|
17
|
+
// If we're using a schema, set the default path for all table names in queries to use that schema
|
|
18
|
+
// Ideally we would rely on Knex config.searchPath to do this for us
|
|
19
|
+
// However, createConnection must remain synchronous and if the user is using a connection function,
|
|
20
|
+
// we do not know what their schema is until after the connection is resolved
|
|
21
|
+
const schemaName = this.db.getSchemaName();
|
|
22
|
+
if (schemaName) {
|
|
23
|
+
await this.db.connection.raw(`SET search_path TO "${schemaName}"`).connection(nativeConnection);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
usesForeignKeys() {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
getSqlType(type) {
|
|
30
|
+
switch(type){
|
|
31
|
+
case 'timestamp':
|
|
32
|
+
{
|
|
33
|
+
return 'datetime';
|
|
34
|
+
}
|
|
35
|
+
default:
|
|
36
|
+
{
|
|
37
|
+
return type;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
transformErrors(error) {
|
|
42
|
+
switch(error.code){
|
|
43
|
+
case '23502':
|
|
44
|
+
{
|
|
45
|
+
throw new notNull({
|
|
46
|
+
column: 'column' in error ? `${error.column}` : undefined
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
default:
|
|
50
|
+
{
|
|
51
|
+
super.transformErrors(error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
constructor(db){
|
|
56
|
+
super(db, 'postgres');
|
|
57
|
+
this.schemaInspector = new schemaInspector(db);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
module.exports = PostgresDialect;
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/dialects/postgresql/index.ts"],"sourcesContent":["import * as errors from '../../errors';\nimport type { Database } from '../..';\nimport Dialect from '../dialect';\nimport PostgresqlSchemaInspector from './schema-inspector';\n\nexport default class PostgresDialect extends Dialect {\n schemaInspector: PostgresqlSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'postgres');\n\n this.schemaInspector = new PostgresqlSchemaInspector(db);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n // Don't cast DATE string to Date()\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.DATE,\n 'text',\n (v: unknown) => v\n );\n // Don't parse JSONB automatically\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.JSONB,\n 'text',\n (v: unknown) => v\n );\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.NUMERIC,\n 'text',\n parseFloat\n );\n\n // If we're using a schema, set the default path for all table names in queries to use that schema\n // Ideally we would rely on Knex config.searchPath to do this for us\n // However, createConnection must remain synchronous and if the user is using a connection function,\n // we do not know what their schema is until after the connection is resolved\n const schemaName = this.db.getSchemaName();\n if (schemaName) {\n await this.db.connection\n .raw(`SET search_path TO \"${schemaName}\"`)\n .connection(nativeConnection);\n }\n }\n\n usesForeignKeys() {\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n transformErrors(error: NodeJS.ErrnoException) {\n switch (error.code) {\n case '23502': {\n throw new errors.NotNullError({\n column: 'column' in error ? `${error.column}` : undefined,\n });\n }\n default: {\n super.transformErrors(error);\n }\n }\n }\n}\n"],"names":["PostgresDialect","Dialect","useReturning","initialize","nativeConnection","db","connection","client","driver","types","setTypeParser","builtins","DATE","v","JSONB","NUMERIC","parseFloat","schemaName","getSchemaName","raw","usesForeignKeys","getSqlType","type","transformErrors","error","code","errors","column","undefined","constructor","schemaInspector","PostgresqlSchemaInspector"],"mappings":";;;;;;AAKe,MAAMA,eAAwBC,SAAAA,OAAAA,CAAAA;IAS3CC,YAAe,GAAA;QACb,OAAO,IAAA;AACT;IAEA,MAAMC,UAAAA,CAAWC,gBAAyB,EAAE;;AAE1C,QAAA,IAAI,CAACC,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACC,IAAI,EACpD,MAAA,EACA,CAACC,CAAeA,GAAAA,CAAAA,CAAAA;;AAGlB,QAAA,IAAI,CAACR,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACG,KAAK,EACrD,MAAA,EACA,CAACD,CAAeA,GAAAA,CAAAA,CAAAA;AAElB,QAAA,IAAI,CAACR,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACI,OAAO,EACvD,MACAC,EAAAA,UAAAA,CAAAA;;;;;AAOF,QAAA,MAAMC,UAAa,GAAA,IAAI,CAACZ,EAAE,CAACa,aAAa,EAAA;AACxC,QAAA,IAAID,UAAY,EAAA;AACd,YAAA,MAAM,IAAI,CAACZ,EAAE,CAACC,UAAU,CACrBa,GAAG,CAAC,CAAC,oBAAoB,EAAEF,UAAW,CAAA,CAAC,CAAC,CAAA,CACxCX,UAAU,CAACF,gBAAAA,CAAAA;AAChB;AACF;IAEAgB,eAAkB,GAAA;QAChB,OAAO,IAAA;AACT;AAEAC,IAAAA,UAAAA,CAAWC,IAAY,EAAE;QACvB,OAAQA,IAAAA;YACN,KAAK,WAAA;AAAa,gBAAA;oBAChB,OAAO,UAAA;AACT;AACA,YAAA;AAAS,gBAAA;oBACP,OAAOA,IAAAA;AACT;AACF;AACF;AAEAC,IAAAA,eAAAA,CAAgBC,KAA4B,EAAE;AAC5C,QAAA,OAAQA,MAAMC,IAAI;YAChB,KAAK,OAAA;AAAS,gBAAA;oBACZ,MAAM,IAAIC,OAAmB,CAAC;wBAC5BC,MAAQ,EAAA,QAAA,IAAYH,QAAQ,CAAC,EAAEA,MAAMG,MAAM,CAAC,CAAC,GAAGC;AAClD,qBAAA,CAAA;AACF;AACA,YAAA;AAAS,gBAAA;AACP,oBAAA,KAAK,CAACL,eAAgBC,CAAAA,KAAAA,CAAAA;AACxB;AACF;AACF;AAnEAK,IAAAA,WAAAA,CAAYxB,EAAY,CAAE;AACxB,QAAA,KAAK,CAACA,EAAI,EAAA,UAAA,CAAA;AAEV,QAAA,IAAI,CAACyB,eAAe,GAAG,IAAIC,eAA0B1B,CAAAA,EAAAA,CAAAA;AACvD;AAgEF;;;;"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import NotNullError from '../../errors/not-null.mjs';
|
|
2
|
+
import Dialect from '../dialect.mjs';
|
|
3
|
+
import PostgresqlSchemaInspector from './schema-inspector.mjs';
|
|
4
|
+
|
|
5
|
+
class PostgresDialect extends Dialect {
|
|
6
|
+
useReturning() {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
async initialize(nativeConnection) {
|
|
10
|
+
// Don't cast DATE string to Date()
|
|
11
|
+
this.db.connection.client.driver.types.setTypeParser(this.db.connection.client.driver.types.builtins.DATE, 'text', (v)=>v);
|
|
12
|
+
// Don't parse JSONB automatically
|
|
13
|
+
this.db.connection.client.driver.types.setTypeParser(this.db.connection.client.driver.types.builtins.JSONB, 'text', (v)=>v);
|
|
14
|
+
this.db.connection.client.driver.types.setTypeParser(this.db.connection.client.driver.types.builtins.NUMERIC, 'text', parseFloat);
|
|
15
|
+
// If we're using a schema, set the default path for all table names in queries to use that schema
|
|
16
|
+
// Ideally we would rely on Knex config.searchPath to do this for us
|
|
17
|
+
// However, createConnection must remain synchronous and if the user is using a connection function,
|
|
18
|
+
// we do not know what their schema is until after the connection is resolved
|
|
19
|
+
const schemaName = this.db.getSchemaName();
|
|
20
|
+
if (schemaName) {
|
|
21
|
+
await this.db.connection.raw(`SET search_path TO "${schemaName}"`).connection(nativeConnection);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
usesForeignKeys() {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
getSqlType(type) {
|
|
28
|
+
switch(type){
|
|
29
|
+
case 'timestamp':
|
|
30
|
+
{
|
|
31
|
+
return 'datetime';
|
|
32
|
+
}
|
|
33
|
+
default:
|
|
34
|
+
{
|
|
35
|
+
return type;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
transformErrors(error) {
|
|
40
|
+
switch(error.code){
|
|
41
|
+
case '23502':
|
|
42
|
+
{
|
|
43
|
+
throw new NotNullError({
|
|
44
|
+
column: 'column' in error ? `${error.column}` : undefined
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
default:
|
|
48
|
+
{
|
|
49
|
+
super.transformErrors(error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
constructor(db){
|
|
54
|
+
super(db, 'postgres');
|
|
55
|
+
this.schemaInspector = new PostgresqlSchemaInspector(db);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { PostgresDialect as default };
|
|
60
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/dialects/postgresql/index.ts"],"sourcesContent":["import * as errors from '../../errors';\nimport type { Database } from '../..';\nimport Dialect from '../dialect';\nimport PostgresqlSchemaInspector from './schema-inspector';\n\nexport default class PostgresDialect extends Dialect {\n schemaInspector: PostgresqlSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'postgres');\n\n this.schemaInspector = new PostgresqlSchemaInspector(db);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n // Don't cast DATE string to Date()\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.DATE,\n 'text',\n (v: unknown) => v\n );\n // Don't parse JSONB automatically\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.JSONB,\n 'text',\n (v: unknown) => v\n );\n this.db.connection.client.driver.types.setTypeParser(\n this.db.connection.client.driver.types.builtins.NUMERIC,\n 'text',\n parseFloat\n );\n\n // If we're using a schema, set the default path for all table names in queries to use that schema\n // Ideally we would rely on Knex config.searchPath to do this for us\n // However, createConnection must remain synchronous and if the user is using a connection function,\n // we do not know what their schema is until after the connection is resolved\n const schemaName = this.db.getSchemaName();\n if (schemaName) {\n await this.db.connection\n .raw(`SET search_path TO \"${schemaName}\"`)\n .connection(nativeConnection);\n }\n }\n\n usesForeignKeys() {\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n transformErrors(error: NodeJS.ErrnoException) {\n switch (error.code) {\n case '23502': {\n throw new errors.NotNullError({\n column: 'column' in error ? `${error.column}` : undefined,\n });\n }\n default: {\n super.transformErrors(error);\n }\n }\n }\n}\n"],"names":["PostgresDialect","Dialect","useReturning","initialize","nativeConnection","db","connection","client","driver","types","setTypeParser","builtins","DATE","v","JSONB","NUMERIC","parseFloat","schemaName","getSchemaName","raw","usesForeignKeys","getSqlType","type","transformErrors","error","code","errors","column","undefined","constructor","schemaInspector","PostgresqlSchemaInspector"],"mappings":";;;;AAKe,MAAMA,eAAwBC,SAAAA,OAAAA,CAAAA;IAS3CC,YAAe,GAAA;QACb,OAAO,IAAA;AACT;IAEA,MAAMC,UAAAA,CAAWC,gBAAyB,EAAE;;AAE1C,QAAA,IAAI,CAACC,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACC,IAAI,EACpD,MAAA,EACA,CAACC,CAAeA,GAAAA,CAAAA,CAAAA;;AAGlB,QAAA,IAAI,CAACR,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACG,KAAK,EACrD,MAAA,EACA,CAACD,CAAeA,GAAAA,CAAAA,CAAAA;AAElB,QAAA,IAAI,CAACR,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,aAAa,CAClD,IAAI,CAACL,EAAE,CAACC,UAAU,CAACC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACE,QAAQ,CAACI,OAAO,EACvD,MACAC,EAAAA,UAAAA,CAAAA;;;;;AAOF,QAAA,MAAMC,UAAa,GAAA,IAAI,CAACZ,EAAE,CAACa,aAAa,EAAA;AACxC,QAAA,IAAID,UAAY,EAAA;AACd,YAAA,MAAM,IAAI,CAACZ,EAAE,CAACC,UAAU,CACrBa,GAAG,CAAC,CAAC,oBAAoB,EAAEF,UAAW,CAAA,CAAC,CAAC,CAAA,CACxCX,UAAU,CAACF,gBAAAA,CAAAA;AAChB;AACF;IAEAgB,eAAkB,GAAA;QAChB,OAAO,IAAA;AACT;AAEAC,IAAAA,UAAAA,CAAWC,IAAY,EAAE;QACvB,OAAQA,IAAAA;YACN,KAAK,WAAA;AAAa,gBAAA;oBAChB,OAAO,UAAA;AACT;AACA,YAAA;AAAS,gBAAA;oBACP,OAAOA,IAAAA;AACT;AACF;AACF;AAEAC,IAAAA,eAAAA,CAAgBC,KAA4B,EAAE;AAC5C,QAAA,OAAQA,MAAMC,IAAI;YAChB,KAAK,OAAA;AAAS,gBAAA;oBACZ,MAAM,IAAIC,YAAmB,CAAC;wBAC5BC,MAAQ,EAAA,QAAA,IAAYH,QAAQ,CAAC,EAAEA,MAAMG,MAAM,CAAC,CAAC,GAAGC;AAClD,qBAAA,CAAA;AACF;AACA,YAAA;AAAS,gBAAA;AACP,oBAAA,KAAK,CAACL,eAAgBC,CAAAA,KAAAA,CAAAA;AACxB;AACF;AACF;AAnEAK,IAAAA,WAAAA,CAAYxB,EAAY,CAAE;AACxB,QAAA,KAAK,CAACA,EAAI,EAAA,UAAA,CAAA;AAEV,QAAA,IAAI,CAACyB,eAAe,GAAG,IAAIC,yBAA0B1B,CAAAA,EAAAA,CAAAA;AACvD;AAgEF;;;;"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const SQL_QUERIES = {
|
|
4
|
+
TABLE_LIST: /* sql */ `
|
|
5
|
+
SELECT *
|
|
6
|
+
FROM information_schema.tables
|
|
7
|
+
WHERE
|
|
8
|
+
table_schema = ?
|
|
9
|
+
AND table_type = 'BASE TABLE'
|
|
10
|
+
AND table_name != 'geometry_columns'
|
|
11
|
+
AND table_name != 'spatial_ref_sys';
|
|
12
|
+
`,
|
|
13
|
+
LIST_COLUMNS: /* sql */ `
|
|
14
|
+
SELECT data_type, column_name, character_maximum_length, column_default, is_nullable
|
|
15
|
+
FROM information_schema.columns
|
|
16
|
+
WHERE table_schema = ? AND table_name = ?;
|
|
17
|
+
`,
|
|
18
|
+
INDEX_LIST: /* sql */ `
|
|
19
|
+
SELECT
|
|
20
|
+
ix.indexrelid,
|
|
21
|
+
i.relname as index_name,
|
|
22
|
+
a.attname as column_name,
|
|
23
|
+
ix.indisunique as is_unique,
|
|
24
|
+
ix.indisprimary as is_primary
|
|
25
|
+
FROM
|
|
26
|
+
pg_class t,
|
|
27
|
+
pg_namespace s,
|
|
28
|
+
pg_class i,
|
|
29
|
+
pg_index ix,
|
|
30
|
+
pg_attribute a
|
|
31
|
+
WHERE
|
|
32
|
+
t.oid = ix.indrelid
|
|
33
|
+
AND i.oid = ix.indexrelid
|
|
34
|
+
AND a.attrelid = t.oid
|
|
35
|
+
AND a.attnum = ANY(ix.indkey)
|
|
36
|
+
AND t.relkind = 'r'
|
|
37
|
+
AND t.relnamespace = s.oid
|
|
38
|
+
AND s.nspname = ?
|
|
39
|
+
AND t.relname = ?;
|
|
40
|
+
`,
|
|
41
|
+
FOREIGN_KEY_LIST: /* sql */ `
|
|
42
|
+
SELECT
|
|
43
|
+
tco."constraint_name" as constraint_name
|
|
44
|
+
FROM information_schema.table_constraints tco
|
|
45
|
+
WHERE
|
|
46
|
+
tco.constraint_type = 'FOREIGN KEY'
|
|
47
|
+
AND tco.constraint_schema = ?
|
|
48
|
+
AND tco.table_name = ?
|
|
49
|
+
`,
|
|
50
|
+
FOREIGN_KEY_REFERENCES: /* sql */ `
|
|
51
|
+
SELECT
|
|
52
|
+
kcu."constraint_name" as constraint_name,
|
|
53
|
+
kcu."column_name" as column_name
|
|
54
|
+
|
|
55
|
+
FROM information_schema.key_column_usage kcu
|
|
56
|
+
WHERE kcu.constraint_name=ANY(?)
|
|
57
|
+
AND kcu.table_schema = ?
|
|
58
|
+
AND kcu.table_name = ?;
|
|
59
|
+
`,
|
|
60
|
+
FOREIGN_KEY_REFERENCES_CONSTRAIN: /* sql */ `
|
|
61
|
+
SELECT
|
|
62
|
+
rco.update_rule as on_update,
|
|
63
|
+
rco.delete_rule as on_delete,
|
|
64
|
+
rco."unique_constraint_name" as unique_constraint_name
|
|
65
|
+
FROM information_schema.referential_constraints rco
|
|
66
|
+
WHERE rco.constraint_name=ANY(?)
|
|
67
|
+
AND rco.constraint_schema = ?
|
|
68
|
+
`,
|
|
69
|
+
FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE: /* sql */ `
|
|
70
|
+
SELECT
|
|
71
|
+
rel_kcu."table_name" as foreign_table,
|
|
72
|
+
rel_kcu."column_name" as fk_column_name
|
|
73
|
+
FROM information_schema.key_column_usage rel_kcu
|
|
74
|
+
WHERE rel_kcu.constraint_name=?
|
|
75
|
+
AND rel_kcu.table_schema = ?
|
|
76
|
+
`
|
|
77
|
+
};
|
|
78
|
+
const toStrapiType = (column)=>{
|
|
79
|
+
const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];
|
|
80
|
+
switch(rootType){
|
|
81
|
+
case 'integer':
|
|
82
|
+
{
|
|
83
|
+
// find a way to figure out the increments
|
|
84
|
+
return {
|
|
85
|
+
type: 'integer'
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
case 'text':
|
|
89
|
+
{
|
|
90
|
+
return {
|
|
91
|
+
type: 'text',
|
|
92
|
+
args: [
|
|
93
|
+
'longtext'
|
|
94
|
+
]
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
case 'boolean':
|
|
98
|
+
{
|
|
99
|
+
return {
|
|
100
|
+
type: 'boolean'
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
case 'character':
|
|
104
|
+
{
|
|
105
|
+
return {
|
|
106
|
+
type: 'string',
|
|
107
|
+
args: [
|
|
108
|
+
column.character_maximum_length
|
|
109
|
+
]
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
case 'timestamp':
|
|
113
|
+
{
|
|
114
|
+
return {
|
|
115
|
+
type: 'datetime',
|
|
116
|
+
args: [
|
|
117
|
+
{
|
|
118
|
+
useTz: false,
|
|
119
|
+
precision: 6
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
case 'date':
|
|
125
|
+
{
|
|
126
|
+
return {
|
|
127
|
+
type: 'date'
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
case 'time':
|
|
131
|
+
{
|
|
132
|
+
return {
|
|
133
|
+
type: 'time',
|
|
134
|
+
args: [
|
|
135
|
+
{
|
|
136
|
+
precision: 3
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
case 'numeric':
|
|
142
|
+
{
|
|
143
|
+
return {
|
|
144
|
+
type: 'decimal',
|
|
145
|
+
args: [
|
|
146
|
+
10,
|
|
147
|
+
2
|
|
148
|
+
]
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
case 'real':
|
|
152
|
+
case 'double':
|
|
153
|
+
{
|
|
154
|
+
return {
|
|
155
|
+
type: 'double'
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
case 'bigint':
|
|
159
|
+
{
|
|
160
|
+
return {
|
|
161
|
+
type: 'bigInteger'
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
case 'jsonb':
|
|
165
|
+
{
|
|
166
|
+
return {
|
|
167
|
+
type: 'jsonb'
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
default:
|
|
171
|
+
{
|
|
172
|
+
return {
|
|
173
|
+
type: 'specificType',
|
|
174
|
+
args: [
|
|
175
|
+
column.data_type
|
|
176
|
+
]
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const getIndexType = (index)=>{
|
|
182
|
+
if (index.is_primary) {
|
|
183
|
+
return 'primary';
|
|
184
|
+
}
|
|
185
|
+
if (index.is_unique) {
|
|
186
|
+
return 'unique';
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
class PostgresqlSchemaInspector {
|
|
190
|
+
async getSchema() {
|
|
191
|
+
const schema = {
|
|
192
|
+
tables: []
|
|
193
|
+
};
|
|
194
|
+
const tables = await this.getTables();
|
|
195
|
+
schema.tables = await Promise.all(tables.map(async (tableName)=>{
|
|
196
|
+
const columns = await this.getColumns(tableName);
|
|
197
|
+
const indexes = await this.getIndexes(tableName);
|
|
198
|
+
const foreignKeys = await this.getForeignKeys(tableName);
|
|
199
|
+
return {
|
|
200
|
+
name: tableName,
|
|
201
|
+
columns,
|
|
202
|
+
indexes,
|
|
203
|
+
foreignKeys
|
|
204
|
+
};
|
|
205
|
+
}));
|
|
206
|
+
return schema;
|
|
207
|
+
}
|
|
208
|
+
getDatabaseSchema() {
|
|
209
|
+
return this.db.getSchemaName() || 'public';
|
|
210
|
+
}
|
|
211
|
+
async getTables() {
|
|
212
|
+
const { rows } = await this.db.connection.raw(SQL_QUERIES.TABLE_LIST, [
|
|
213
|
+
this.getDatabaseSchema()
|
|
214
|
+
]);
|
|
215
|
+
return rows.map((row)=>row.table_name);
|
|
216
|
+
}
|
|
217
|
+
async getColumns(tableName) {
|
|
218
|
+
const { rows } = await this.db.connection.raw(SQL_QUERIES.LIST_COLUMNS, [
|
|
219
|
+
this.getDatabaseSchema(),
|
|
220
|
+
tableName
|
|
221
|
+
]);
|
|
222
|
+
return rows.map((row)=>{
|
|
223
|
+
const { type, args = [], ...rest } = toStrapiType(row);
|
|
224
|
+
const defaultTo = row.column_default && row.column_default.includes('nextval(') ? null : row.column_default;
|
|
225
|
+
return {
|
|
226
|
+
type,
|
|
227
|
+
args,
|
|
228
|
+
defaultTo,
|
|
229
|
+
name: row.column_name,
|
|
230
|
+
notNullable: row.is_nullable === 'NO',
|
|
231
|
+
unsigned: false,
|
|
232
|
+
...rest
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
async getIndexes(tableName) {
|
|
237
|
+
const { rows } = await this.db.connection.raw(SQL_QUERIES.INDEX_LIST, [
|
|
238
|
+
this.getDatabaseSchema(),
|
|
239
|
+
tableName
|
|
240
|
+
]);
|
|
241
|
+
const ret = {};
|
|
242
|
+
for (const index of rows){
|
|
243
|
+
if (index.column_name === 'id') {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (!ret[index.indexrelid]) {
|
|
247
|
+
ret[index.indexrelid] = {
|
|
248
|
+
columns: [
|
|
249
|
+
index.column_name
|
|
250
|
+
],
|
|
251
|
+
name: index.index_name,
|
|
252
|
+
type: getIndexType(index)
|
|
253
|
+
};
|
|
254
|
+
} else {
|
|
255
|
+
ret[index.indexrelid].columns.push(index.column_name);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return Object.values(ret);
|
|
259
|
+
}
|
|
260
|
+
async getForeignKeys(tableName) {
|
|
261
|
+
const { rows } = await this.db.connection.raw(SQL_QUERIES.FOREIGN_KEY_LIST, [
|
|
262
|
+
this.getDatabaseSchema(),
|
|
263
|
+
tableName
|
|
264
|
+
]);
|
|
265
|
+
const ret = {};
|
|
266
|
+
for (const fk of rows){
|
|
267
|
+
ret[fk.constraint_name] = {
|
|
268
|
+
name: fk.constraint_name,
|
|
269
|
+
columns: [],
|
|
270
|
+
referencedColumns: [],
|
|
271
|
+
referencedTable: null,
|
|
272
|
+
onUpdate: null,
|
|
273
|
+
onDelete: null
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
const constraintNames = Object.keys(ret);
|
|
277
|
+
const dbSchema = this.getDatabaseSchema();
|
|
278
|
+
if (constraintNames.length > 0) {
|
|
279
|
+
const { rows: fkReferences } = await this.db.connection.raw(SQL_QUERIES.FOREIGN_KEY_REFERENCES, [
|
|
280
|
+
[
|
|
281
|
+
constraintNames
|
|
282
|
+
],
|
|
283
|
+
dbSchema,
|
|
284
|
+
tableName
|
|
285
|
+
]);
|
|
286
|
+
for (const fkReference of fkReferences){
|
|
287
|
+
ret[fkReference.constraint_name].columns.push(fkReference.column_name);
|
|
288
|
+
const { rows: fkReferencesConstraint } = await this.db.connection.raw(SQL_QUERIES.FOREIGN_KEY_REFERENCES_CONSTRAIN, [
|
|
289
|
+
[
|
|
290
|
+
fkReference.constraint_name
|
|
291
|
+
],
|
|
292
|
+
dbSchema
|
|
293
|
+
]);
|
|
294
|
+
for (const fkReferenceC of fkReferencesConstraint){
|
|
295
|
+
const { rows: fkReferencesConstraintReferece } = await this.db.connection.raw(SQL_QUERIES.FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE, [
|
|
296
|
+
fkReferenceC.unique_constraint_name,
|
|
297
|
+
dbSchema
|
|
298
|
+
]);
|
|
299
|
+
for (const fkReferenceConst of fkReferencesConstraintReferece){
|
|
300
|
+
ret[fkReference.constraint_name].referencedTable = fkReferenceConst.foreign_table;
|
|
301
|
+
ret[fkReference.constraint_name].referencedColumns.push(fkReferenceConst.fk_column_name);
|
|
302
|
+
}
|
|
303
|
+
ret[fkReference.constraint_name].onUpdate = fkReferenceC.on_update.toUpperCase();
|
|
304
|
+
ret[fkReference.constraint_name].onDelete = fkReferenceC.on_delete.toUpperCase();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return Object.values(ret);
|
|
309
|
+
}
|
|
310
|
+
constructor(db){
|
|
311
|
+
this.db = db;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
module.exports = PostgresqlSchemaInspector;
|
|
316
|
+
//# sourceMappingURL=schema-inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-inspector.js","sources":["../../../src/dialects/postgresql/schema-inspector.ts"],"sourcesContent":["import type { Database } from '../..';\nimport type { Schema, Column, Index, ForeignKey } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\n\ninterface RawTable {\n table_name: string;\n}\n\ninterface RawColumn {\n data_type: string;\n column_name: string;\n character_maximum_length: number;\n column_default: string;\n is_nullable: string;\n}\n\ninterface RawIndex {\n indexrelid: string;\n index_name: string;\n column_name: string;\n is_unique: boolean;\n is_primary: boolean;\n}\n\ninterface RawForeignKey {\n constraint_name: string;\n}\n\nconst SQL_QUERIES = {\n TABLE_LIST: /* sql */ `\n SELECT *\n FROM information_schema.tables\n WHERE\n table_schema = ?\n AND table_type = 'BASE TABLE'\n AND table_name != 'geometry_columns'\n AND table_name != 'spatial_ref_sys';\n `,\n LIST_COLUMNS: /* sql */ `\n SELECT data_type, column_name, character_maximum_length, column_default, is_nullable\n FROM information_schema.columns\n WHERE table_schema = ? AND table_name = ?;\n `,\n INDEX_LIST: /* sql */ `\n SELECT\n ix.indexrelid,\n i.relname as index_name,\n a.attname as column_name,\n ix.indisunique as is_unique,\n ix.indisprimary as is_primary\n FROM\n pg_class t,\n pg_namespace s,\n pg_class i,\n pg_index ix,\n pg_attribute a\n WHERE\n t.oid = ix.indrelid\n AND i.oid = ix.indexrelid\n AND a.attrelid = t.oid\n AND a.attnum = ANY(ix.indkey)\n AND t.relkind = 'r'\n AND t.relnamespace = s.oid\n AND s.nspname = ?\n AND t.relname = ?;\n `,\n FOREIGN_KEY_LIST: /* sql */ `\n SELECT\n tco.\"constraint_name\" as constraint_name\n FROM information_schema.table_constraints tco\n WHERE\n tco.constraint_type = 'FOREIGN KEY'\n AND tco.constraint_schema = ?\n AND tco.table_name = ?\n `,\n FOREIGN_KEY_REFERENCES: /* sql */ `\n SELECT\n kcu.\"constraint_name\" as constraint_name,\n kcu.\"column_name\" as column_name\n\n FROM information_schema.key_column_usage kcu\n WHERE kcu.constraint_name=ANY(?)\n AND kcu.table_schema = ?\n AND kcu.table_name = ?;\n `,\n\n FOREIGN_KEY_REFERENCES_CONSTRAIN: /* sql */ `\n SELECT\n rco.update_rule as on_update,\n rco.delete_rule as on_delete,\n rco.\"unique_constraint_name\" as unique_constraint_name\n FROM information_schema.referential_constraints rco\n WHERE rco.constraint_name=ANY(?)\n AND rco.constraint_schema = ?\n`,\n FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE: /* sql */ `\n SELECT\n rel_kcu.\"table_name\" as foreign_table,\n rel_kcu.\"column_name\" as fk_column_name\n FROM information_schema.key_column_usage rel_kcu\n WHERE rel_kcu.constraint_name=?\n AND rel_kcu.table_schema = ?\n`,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n switch (rootType) {\n case 'integer': {\n // find a way to figure out the increments\n return { type: 'integer' };\n }\n case 'text': {\n return { type: 'text', args: ['longtext'] };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n case 'character': {\n return { type: 'string', args: [column.character_maximum_length] };\n }\n case 'timestamp': {\n return { type: 'datetime', args: [{ useTz: false, precision: 6 }] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'numeric': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'real':\n case 'double': {\n return { type: 'double' };\n }\n case 'bigint': {\n return { type: 'bigInteger' };\n }\n case 'jsonb': {\n return { type: 'jsonb' };\n }\n default: {\n return { type: 'specificType', args: [column.data_type] };\n }\n }\n};\n\nconst getIndexType = (index: RawIndex) => {\n if (index.is_primary) {\n return 'primary';\n }\n\n if (index.is_unique) {\n return 'unique';\n }\n};\n\nexport default class PostgresqlSchemaInspector implements SchemaInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getSchema() {\n const schema: Schema = { tables: [] };\n\n const tables = await this.getTables();\n\n schema.tables = await Promise.all(\n tables.map(async (tableName) => {\n const columns = await this.getColumns(tableName);\n const indexes = await this.getIndexes(tableName);\n const foreignKeys = await this.getForeignKeys(tableName);\n\n return {\n name: tableName,\n columns,\n indexes,\n foreignKeys,\n };\n })\n );\n\n return schema;\n }\n\n getDatabaseSchema(): string {\n return this.db.getSchemaName() || 'public';\n }\n\n async getTables(): Promise<string[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawTable[] }>(SQL_QUERIES.TABLE_LIST, [\n this.getDatabaseSchema(),\n ]);\n\n return rows.map((row) => row.table_name);\n }\n\n async getColumns(tableName: string): Promise<Column[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawColumn[] }>(SQL_QUERIES.LIST_COLUMNS, [\n this.getDatabaseSchema(),\n tableName,\n ]);\n\n return rows.map((row) => {\n const { type, args = [], ...rest } = toStrapiType(row);\n\n const defaultTo =\n row.column_default && row.column_default.includes('nextval(') ? null : row.column_default;\n\n return {\n type,\n args,\n defaultTo,\n name: row.column_name,\n notNullable: row.is_nullable === 'NO',\n unsigned: false,\n ...rest,\n };\n });\n }\n\n async getIndexes(tableName: string): Promise<Index[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawIndex[] }>(SQL_QUERIES.INDEX_LIST, [\n this.getDatabaseSchema(),\n tableName,\n ]);\n\n const ret: Record<RawIndex['indexrelid'], Index> = {};\n\n for (const index of rows) {\n if (index.column_name === 'id') {\n continue;\n }\n\n if (!ret[index.indexrelid]) {\n ret[index.indexrelid] = {\n columns: [index.column_name],\n name: index.index_name,\n type: getIndexType(index),\n };\n } else {\n ret[index.indexrelid].columns.push(index.column_name);\n }\n }\n\n return Object.values(ret);\n }\n\n async getForeignKeys(tableName: string): Promise<ForeignKey[]> {\n const { rows } = await this.db.connection.raw<{ rows: RawForeignKey[] }>(\n SQL_QUERIES.FOREIGN_KEY_LIST,\n [this.getDatabaseSchema(), tableName]\n );\n\n const ret: Record<RawForeignKey['constraint_name'], ForeignKey> = {};\n\n for (const fk of rows) {\n ret[fk.constraint_name] = {\n name: fk.constraint_name,\n columns: [],\n referencedColumns: [],\n referencedTable: null,\n onUpdate: null,\n onDelete: null,\n } as unknown as ForeignKey;\n }\n\n const constraintNames = Object.keys(ret);\n const dbSchema = this.getDatabaseSchema();\n if (constraintNames.length > 0) {\n const { rows: fkReferences } = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENCES,\n [[constraintNames], dbSchema, tableName]\n );\n\n for (const fkReference of fkReferences) {\n ret[fkReference.constraint_name].columns.push(fkReference.column_name);\n\n const { rows: fkReferencesConstraint } = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENCES_CONSTRAIN,\n [[fkReference.constraint_name], dbSchema]\n );\n\n for (const fkReferenceC of fkReferencesConstraint) {\n const { rows: fkReferencesConstraintReferece } = await this.db.connection.raw(\n SQL_QUERIES.FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE,\n [fkReferenceC.unique_constraint_name, dbSchema]\n );\n for (const fkReferenceConst of fkReferencesConstraintReferece) {\n ret[fkReference.constraint_name].referencedTable = fkReferenceConst.foreign_table;\n ret[fkReference.constraint_name].referencedColumns.push(\n fkReferenceConst.fk_column_name\n );\n }\n ret[fkReference.constraint_name].onUpdate = fkReferenceC.on_update.toUpperCase();\n ret[fkReference.constraint_name].onDelete = fkReferenceC.on_delete.toUpperCase();\n }\n }\n }\n\n return Object.values(ret);\n }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","LIST_COLUMNS","INDEX_LIST","FOREIGN_KEY_LIST","FOREIGN_KEY_REFERENCES","FOREIGN_KEY_REFERENCES_CONSTRAIN","FOREIGN_KEY_REFERENCES_CONSTRAIN_RFERENCE","toStrapiType","column","rootType","data_type","toLowerCase","match","type","args","character_maximum_length","useTz","precision","getIndexType","index","is_primary","is_unique","PostgresqlSchemaInspector","getSchema","schema","tables","getTables","Promise","all","map","tableName","columns","getColumns","indexes","getIndexes","foreignKeys","getForeignKeys","name","getDatabaseSchema","db","getSchemaName","rows","connection","raw","row","table_name","rest","defaultTo","column_default","includes","column_name","notNullable","is_nullable","unsigned","ret","indexrelid","index_name","push","Object","values","fk","constraint_name","referencedColumns","referencedTable","onUpdate","onDelete","constraintNames","keys","dbSchema","length","fkReferences","fkReference","fkReferencesConstraint","fkReferenceC","fkReferencesConstraintReferece","unique_constraint_name","fkReferenceConst","foreign_table","fk_column_name","on_update","toUpperCase","on_delete","constructor"],"mappings":"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"}
|