drizzle-orm 0.10.25 → 0.10.28
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/.eslintrc +28 -0
- package/.tslintignore +1 -0
- package/CHANGELOG.md +202 -0
- package/README.md +439 -0
- package/dist/builders/aggregators/abstractAggregator.d.ts +11 -0
- package/dist/builders/aggregators/abstractAggregator.js +35 -0
- package/dist/builders/aggregators/deleteAggregator.d.ts +16 -0
- package/dist/builders/aggregators/deleteAggregator.js +42 -0
- package/dist/builders/aggregators/insertAggregator.d.ts +22 -0
- package/dist/builders/aggregators/insertAggregator.js +106 -0
- package/dist/builders/aggregators/selectAggregator.d.ts +39 -0
- package/dist/builders/aggregators/selectAggregator.js +143 -0
- package/dist/builders/aggregators/updateAggregator.d.ts +19 -0
- package/dist/builders/aggregators/updateAggregator.js +50 -0
- package/dist/builders/highLvlBuilders/abstractRequestBuilder.d.ts +27 -0
- package/dist/builders/highLvlBuilders/abstractRequestBuilder.js +32 -0
- package/dist/builders/highLvlBuilders/deleteRequestBuilder.d.ts +19 -0
- package/dist/builders/highLvlBuilders/deleteRequestBuilder.js +61 -0
- package/dist/builders/highLvlBuilders/insertRequestBuilder.d.ts +20 -0
- package/dist/builders/highLvlBuilders/insertRequestBuilder.js +73 -0
- package/dist/builders/highLvlBuilders/order.d.ts +5 -0
- package/dist/builders/highLvlBuilders/order.js +8 -0
- package/dist/builders/highLvlBuilders/selectRequestBuilder.d.ts +47 -0
- package/dist/builders/highLvlBuilders/selectRequestBuilder.js +128 -0
- package/dist/builders/highLvlBuilders/updateRequestBuilder.d.ts +22 -0
- package/dist/builders/highLvlBuilders/updateRequestBuilder.js +80 -0
- package/dist/builders/index.d.ts +18 -0
- package/dist/builders/index.js +54 -0
- package/dist/builders/joinBuilders/builders/abstractJoinBuilder.d.ts +40 -0
- package/dist/builders/joinBuilders/builders/abstractJoinBuilder.js +78 -0
- package/dist/builders/joinBuilders/builders/selectWithFiveJoins.d.ts +35 -0
- package/dist/builders/joinBuilders/builders/selectWithFiveJoins.js +45 -0
- package/dist/builders/joinBuilders/builders/selectWithFourJoins.d.ts +55 -0
- package/dist/builders/joinBuilders/builders/selectWithFourJoins.js +78 -0
- package/dist/builders/joinBuilders/builders/selectWithJoin.d.ts +49 -0
- package/dist/builders/joinBuilders/builders/selectWithJoin.js +64 -0
- package/dist/builders/joinBuilders/builders/selectWithThreeJoins.d.ts +53 -0
- package/dist/builders/joinBuilders/builders/selectWithThreeJoins.js +73 -0
- package/dist/builders/joinBuilders/builders/selectWithTwoJoins.d.ts +51 -0
- package/dist/builders/joinBuilders/builders/selectWithTwoJoins.js +68 -0
- package/dist/builders/joinBuilders/join.d.ts +23 -0
- package/dist/builders/joinBuilders/join.js +28 -0
- package/dist/builders/joinBuilders/joinWith.d.ts +14 -0
- package/dist/builders/joinBuilders/joinWith.js +14 -0
- package/dist/builders/joinBuilders/responses/selectResponseFiveJoins.d.ts +20 -0
- package/dist/builders/joinBuilders/responses/selectResponseFiveJoins.js +35 -0
- package/dist/builders/joinBuilders/responses/selectResponseFourJoins.d.ts +19 -0
- package/dist/builders/joinBuilders/responses/selectResponseFourJoins.js +34 -0
- package/dist/builders/joinBuilders/responses/selectResponseThreeJoins.d.ts +18 -0
- package/dist/builders/joinBuilders/responses/selectResponseThreeJoins.js +33 -0
- package/dist/builders/joinBuilders/responses/selectResponseTwoJoins.d.ts +17 -0
- package/dist/builders/joinBuilders/responses/selectResponseTwoJoins.js +32 -0
- package/dist/builders/joinBuilders/responses/selectResponseWithJoin.d.ts +16 -0
- package/dist/builders/joinBuilders/responses/selectResponseWithJoin.js +31 -0
- package/dist/builders/joinBuilders/static.d.ts +5 -0
- package/dist/builders/joinBuilders/static.js +9 -0
- package/dist/builders/lowLvlBuilders/alter.d.ts +0 -0
- package/dist/builders/lowLvlBuilders/alter.js +1 -0
- package/dist/builders/lowLvlBuilders/create.d.ts +12 -0
- package/dist/builders/lowLvlBuilders/create.js +100 -0
- package/dist/builders/lowLvlBuilders/delets/delete.d.ts +5 -0
- package/dist/builders/lowLvlBuilders/delets/delete.js +15 -0
- package/dist/builders/lowLvlBuilders/delets/deleteFilter.d.ts +11 -0
- package/dist/builders/lowLvlBuilders/delets/deleteFilter.js +13 -0
- package/dist/builders/lowLvlBuilders/delets/deleteFrom.d.ts +12 -0
- package/dist/builders/lowLvlBuilders/delets/deleteFrom.js +14 -0
- package/dist/builders/lowLvlBuilders/inserts/insert.d.ts +5 -0
- package/dist/builders/lowLvlBuilders/inserts/insert.js +15 -0
- package/dist/builders/lowLvlBuilders/inserts/insertInto.d.ts +13 -0
- package/dist/builders/lowLvlBuilders/inserts/insertInto.js +16 -0
- package/dist/builders/lowLvlBuilders/inserts/onConflictInsert.d.ts +12 -0
- package/dist/builders/lowLvlBuilders/inserts/onConflictInsert.js +13 -0
- package/dist/builders/lowLvlBuilders/inserts/valuesInsert.d.ts +16 -0
- package/dist/builders/lowLvlBuilders/inserts/valuesInsert.js +19 -0
- package/dist/builders/lowLvlBuilders/selects/select.d.ts +9 -0
- package/dist/builders/lowLvlBuilders/selects/select.js +16 -0
- package/dist/builders/lowLvlBuilders/selects/selectFrom.d.ts +28 -0
- package/dist/builders/lowLvlBuilders/selects/selectFrom.js +34 -0
- package/dist/builders/lowLvlBuilders/selects/selectJoined.d.ts +26 -0
- package/dist/builders/lowLvlBuilders/selects/selectJoined.js +30 -0
- package/dist/builders/lowLvlBuilders/selects/whereSelect.d.ts +17 -0
- package/dist/builders/lowLvlBuilders/selects/whereSelect.js +25 -0
- package/dist/builders/lowLvlBuilders/updates/update.d.ts +5 -0
- package/dist/builders/lowLvlBuilders/updates/update.js +15 -0
- package/dist/builders/lowLvlBuilders/updates/updateIn.d.ts +13 -0
- package/dist/builders/lowLvlBuilders/updates/updateIn.js +15 -0
- package/dist/builders/lowLvlBuilders/updates/whereSelect.d.ts +11 -0
- package/dist/builders/lowLvlBuilders/updates/whereSelect.js +13 -0
- package/dist/builders/lowLvlBuilders/updates/whereSet.d.ts +14 -0
- package/dist/builders/lowLvlBuilders/updates/whereSet.js +18 -0
- package/dist/builders/requestBuilders/updates/combine.d.ts +9 -0
- package/dist/builders/requestBuilders/updates/combine.js +26 -0
- package/dist/builders/requestBuilders/updates/increment.d.ts +13 -0
- package/dist/builders/requestBuilders/updates/increment.js +18 -0
- package/dist/builders/requestBuilders/updates/setObjects.d.ts +12 -0
- package/dist/builders/requestBuilders/updates/setObjects.js +19 -0
- package/dist/builders/requestBuilders/updates/static.d.ts +7 -0
- package/dist/builders/requestBuilders/updates/static.js +15 -0
- package/dist/builders/requestBuilders/updates/updates.d.ts +9 -0
- package/dist/builders/requestBuilders/updates/updates.js +10 -0
- package/dist/builders/requestBuilders/where/and.d.ts +11 -0
- package/dist/builders/requestBuilders/where/and.js +31 -0
- package/dist/builders/requestBuilders/where/const.d.ts +9 -0
- package/dist/builders/requestBuilders/where/const.js +25 -0
- package/dist/builders/requestBuilders/where/constArray.d.ts +9 -0
- package/dist/builders/requestBuilders/where/constArray.js +39 -0
- package/dist/builders/requestBuilders/where/eqWhere.d.ts +12 -0
- package/dist/builders/requestBuilders/where/eqWhere.js +20 -0
- package/dist/builders/requestBuilders/where/greater.d.ts +15 -0
- package/dist/builders/requestBuilders/where/greater.js +20 -0
- package/dist/builders/requestBuilders/where/greaterEq.d.ts +15 -0
- package/dist/builders/requestBuilders/where/greaterEq.js +20 -0
- package/dist/builders/requestBuilders/where/in.d.ts +12 -0
- package/dist/builders/requestBuilders/where/in.js +20 -0
- package/dist/builders/requestBuilders/where/isNotNull.d.ts +11 -0
- package/dist/builders/requestBuilders/where/isNotNull.js +18 -0
- package/dist/builders/requestBuilders/where/isNull.d.ts +11 -0
- package/dist/builders/requestBuilders/where/isNull.js +18 -0
- package/dist/builders/requestBuilders/where/less.d.ts +15 -0
- package/dist/builders/requestBuilders/where/less.js +20 -0
- package/dist/builders/requestBuilders/where/lessEq.d.ts +15 -0
- package/dist/builders/requestBuilders/where/lessEq.js +20 -0
- package/dist/builders/requestBuilders/where/like.d.ts +12 -0
- package/dist/builders/requestBuilders/where/like.js +20 -0
- package/dist/builders/requestBuilders/where/notEqWhere.d.ts +12 -0
- package/dist/builders/requestBuilders/where/notEqWhere.js +20 -0
- package/dist/builders/requestBuilders/where/or.d.ts +11 -0
- package/dist/builders/requestBuilders/where/or.js +31 -0
- package/dist/builders/requestBuilders/where/rawWhere.d.ts +9 -0
- package/dist/builders/requestBuilders/where/rawWhere.js +15 -0
- package/dist/builders/requestBuilders/where/static.d.ts +17 -0
- package/dist/builders/requestBuilders/where/static.js +49 -0
- package/dist/builders/requestBuilders/where/var.d.ts +13 -0
- package/dist/builders/requestBuilders/where/var.js +18 -0
- package/dist/builders/requestBuilders/where/where.d.ts +8 -0
- package/dist/builders/requestBuilders/where/where.js +6 -0
- package/dist/builders/transaction/transaction.d.ts +8 -0
- package/dist/builders/transaction/transaction.js +20 -0
- package/dist/columns/column.d.ts +72 -0
- package/dist/columns/column.js +101 -0
- package/dist/columns/index.d.ts +10 -0
- package/dist/columns/index.js +27 -0
- package/dist/columns/types/columnType.d.ts +7 -0
- package/dist/columns/types/columnType.js +6 -0
- package/dist/columns/types/pgBigDecimal.d.ts +10 -0
- package/dist/columns/types/pgBigDecimal.js +31 -0
- package/dist/columns/types/pgBigInt.d.ts +15 -0
- package/dist/columns/types/pgBigInt.js +32 -0
- package/dist/columns/types/pgBigSerial.d.ts +15 -0
- package/dist/columns/types/pgBigSerial.js +32 -0
- package/dist/columns/types/pgBoolean.d.ts +8 -0
- package/dist/columns/types/pgBoolean.js +18 -0
- package/dist/columns/types/pgEnum.d.ts +9 -0
- package/dist/columns/types/pgEnum.js +18 -0
- package/dist/columns/types/pgInteger.d.ts +8 -0
- package/dist/columns/types/pgInteger.js +21 -0
- package/dist/columns/types/pgJsonb.d.ts +9 -0
- package/dist/columns/types/pgJsonb.js +20 -0
- package/dist/columns/types/pgSerial.d.ts +8 -0
- package/dist/columns/types/pgSerial.js +18 -0
- package/dist/columns/types/pgSmallInt.d.ts +8 -0
- package/dist/columns/types/pgSmallInt.js +18 -0
- package/dist/columns/types/pgText.d.ts +8 -0
- package/dist/columns/types/pgText.js +18 -0
- package/dist/columns/types/pgTime.d.ts +8 -0
- package/dist/columns/types/pgTime.js +18 -0
- package/dist/columns/types/pgTimestamp.d.ts +8 -0
- package/dist/columns/types/pgTimestamp.js +18 -0
- package/dist/columns/types/pgTimestamptz.d.ts +8 -0
- package/dist/columns/types/pgTimestamptz.js +18 -0
- package/dist/columns/types/pgVarChar.d.ts +9 -0
- package/dist/columns/types/pgVarChar.js +24 -0
- package/dist/db/db.d.ts +18 -0
- package/dist/db/db.js +25 -0
- package/dist/db/dbConnector.d.ts +9 -0
- package/dist/db/dbConnector.js +32 -0
- package/dist/db/dbStringConnector.d.ts +6 -0
- package/dist/db/dbStringConnector.js +29 -0
- package/dist/db/group_by.d.ts +0 -0
- package/dist/db/group_by.js +68 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.js +14 -0
- package/dist/db/session.d.ts +9 -0
- package/dist/db/session.js +16 -0
- package/dist/docs/cases/simple_delete.d.ts +1 -0
- package/dist/docs/cases/simple_delete.js +35 -0
- package/dist/docs/cases/simple_insert.d.ts +1 -0
- package/dist/docs/cases/simple_insert.js +57 -0
- package/dist/docs/cases/simple_join.d.ts +1 -0
- package/dist/docs/cases/simple_join.js +115 -0
- package/dist/docs/cases/simple_select.d.ts +1 -0
- package/dist/docs/cases/simple_select.js +50 -0
- package/dist/docs/cases/simple_update.d.ts +1 -0
- package/dist/docs/cases/simple_update.js +39 -0
- package/dist/docs/tables/citiesTable.d.ts +14 -0
- package/dist/docs/tables/citiesTable.js +21 -0
- package/dist/docs/tables/userGroupsTable.d.ts +7 -0
- package/dist/docs/tables/userGroupsTable.js +18 -0
- package/dist/docs/tables/usersTable.d.ts +17 -0
- package/dist/docs/tables/usersTable.js +35 -0
- package/dist/docs/tables/usersToUserGroups.d.ts +7 -0
- package/dist/docs/tables/usersToUserGroups.js +20 -0
- package/dist/docs/types/rolesType.d.ts +1 -0
- package/dist/docs/types/rolesType.js +6 -0
- package/dist/errors/baseError.d.ts +22 -0
- package/dist/errors/baseError.js +35 -0
- package/dist/errors/builderError.d.ts +14 -0
- package/dist/errors/builderError.js +25 -0
- package/dist/errors/dbErrors.d.ts +12 -0
- package/dist/errors/dbErrors.js +28 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +31 -0
- package/dist/indexes/tableIndex.d.ts +11 -0
- package/dist/indexes/tableIndex.js +17 -0
- package/dist/logger/abstractLogger.d.ts +4 -0
- package/dist/logger/abstractLogger.js +5 -0
- package/dist/logger/consoleLogger.d.ts +5 -0
- package/dist/logger/consoleLogger.js +15 -0
- package/dist/mappers/index.d.ts +0 -0
- package/dist/mappers/index.js +1 -0
- package/dist/mappers/responseMapper.d.ts +10 -0
- package/dist/mappers/responseMapper.js +35 -0
- package/dist/migrator/index.d.ts +0 -0
- package/dist/migrator/index.js +1 -0
- package/dist/migrator/migrator.d.ts +11 -0
- package/dist/migrator/migrator.js +105 -0
- package/dist/serializer/serializer.d.ts +47 -0
- package/dist/serializer/serializer.js +258 -0
- package/dist/tables/abstractTable.d.ts +68 -0
- package/dist/tables/abstractTable.js +151 -0
- package/dist/tables/index.d.ts +3 -0
- package/dist/tables/index.js +11 -0
- package/dist/tables/inferTypes.d.ts +39 -0
- package/dist/tables/inferTypes.js +2 -0
- package/dist/tables/migrationsTable.d.ts +7 -0
- package/dist/tables/migrationsTable.js +18 -0
- package/dist/test.d.ts +1 -0
- package/dist/test.js +65 -0
- package/dist/types/type.d.ts +10 -0
- package/dist/types/type.js +14 -0
- package/dist/utils/ecranate.d.ts +2 -0
- package/dist/utils/ecranate.js +8 -0
- package/package.json +3 -7
- package/pnpm-lock.yaml +1842 -0
- package/src/builders/aggregators/abstractAggregator.ts +41 -0
- package/src/builders/aggregators/deleteAggregator.ts +44 -0
- package/src/builders/aggregators/insertAggregator.ts +120 -0
- package/src/builders/aggregators/selectAggregator.ts +163 -0
- package/src/builders/aggregators/updateAggregator.ts +56 -0
- package/src/builders/highLvlBuilders/abstractRequestBuilder.ts +51 -0
- package/src/builders/highLvlBuilders/deleteRequestBuilder.ts +59 -0
- package/src/builders/highLvlBuilders/insertRequestBuilder.ts +75 -0
- package/src/builders/highLvlBuilders/order.ts +4 -0
- package/src/builders/highLvlBuilders/selectRequestBuilder.ts +229 -0
- package/src/builders/highLvlBuilders/updateRequestBuilder.ts +80 -0
- package/src/builders/index.ts +21 -0
- package/src/builders/joinBuilders/builders/abstractJoinBuilder.ts +98 -0
- package/src/builders/joinBuilders/builders/selectWithFiveJoins.ts +110 -0
- package/src/builders/joinBuilders/builders/selectWithFourJoins.ts +254 -0
- package/src/builders/joinBuilders/builders/selectWithJoin.ts +189 -0
- package/src/builders/joinBuilders/builders/selectWithThreeJoins.ts +231 -0
- package/src/builders/joinBuilders/builders/selectWithTwoJoins.ts +210 -0
- package/src/builders/joinBuilders/join.ts +40 -0
- package/src/builders/joinBuilders/joinWith.ts +21 -0
- package/src/builders/joinBuilders/responses/selectResponseFiveJoins.ts +82 -0
- package/src/builders/joinBuilders/responses/selectResponseFourJoins.ts +73 -0
- package/src/builders/joinBuilders/responses/selectResponseThreeJoins.ts +64 -0
- package/src/builders/joinBuilders/responses/selectResponseTwoJoins.ts +57 -0
- package/src/builders/joinBuilders/responses/selectResponseWithJoin.ts +49 -0
- package/src/builders/joinBuilders/static.ts +9 -0
- package/src/builders/lowLvlBuilders/alter.ts +0 -0
- package/src/builders/lowLvlBuilders/create.ts +115 -0
- package/src/builders/lowLvlBuilders/delets/delete.ts +13 -0
- package/src/builders/lowLvlBuilders/delets/deleteFilter.ts +17 -0
- package/src/builders/lowLvlBuilders/delets/deleteFrom.ts +15 -0
- package/src/builders/lowLvlBuilders/inserts/insert.ts +11 -0
- package/src/builders/lowLvlBuilders/inserts/insertInto.ts +16 -0
- package/src/builders/lowLvlBuilders/inserts/onConflictInsert.ts +19 -0
- package/src/builders/lowLvlBuilders/inserts/valuesInsert.ts +27 -0
- package/src/builders/lowLvlBuilders/selects/select.ts +14 -0
- package/src/builders/lowLvlBuilders/selects/selectFrom.ts +50 -0
- package/src/builders/lowLvlBuilders/selects/selectJoined.ts +44 -0
- package/src/builders/lowLvlBuilders/selects/whereSelect.ts +36 -0
- package/src/builders/lowLvlBuilders/updates/update.ts +13 -0
- package/src/builders/lowLvlBuilders/updates/updateIn.ts +17 -0
- package/src/builders/lowLvlBuilders/updates/whereSelect.ts +17 -0
- package/src/builders/lowLvlBuilders/updates/whereSet.ts +21 -0
- package/src/builders/requestBuilders/updates/combine.ts +34 -0
- package/src/builders/requestBuilders/updates/increment.ts +24 -0
- package/src/builders/requestBuilders/updates/setObjects.ts +27 -0
- package/src/builders/requestBuilders/updates/static.ts +15 -0
- package/src/builders/requestBuilders/updates/updates.ts +8 -0
- package/src/builders/requestBuilders/where/and.ts +35 -0
- package/src/builders/requestBuilders/where/const.ts +23 -0
- package/src/builders/requestBuilders/where/constArray.ts +37 -0
- package/src/builders/requestBuilders/where/eqWhere.ts +20 -0
- package/src/builders/requestBuilders/where/greater.ts +20 -0
- package/src/builders/requestBuilders/where/greaterEq.ts +20 -0
- package/src/builders/requestBuilders/where/in.ts +20 -0
- package/src/builders/requestBuilders/where/isNotNull.ts +17 -0
- package/src/builders/requestBuilders/where/isNull.ts +17 -0
- package/src/builders/requestBuilders/where/less.ts +20 -0
- package/src/builders/requestBuilders/where/lessEq.ts +20 -0
- package/src/builders/requestBuilders/where/like.ts +20 -0
- package/src/builders/requestBuilders/where/notEqWhere.ts +20 -0
- package/src/builders/requestBuilders/where/or.ts +35 -0
- package/src/builders/requestBuilders/where/rawWhere.ts +10 -0
- package/src/builders/requestBuilders/where/static.ts +60 -0
- package/src/builders/requestBuilders/where/var.ts +19 -0
- package/src/builders/requestBuilders/where/where.ts +5 -0
- package/src/builders/transaction/transaction.ts +21 -0
- package/src/columns/column.ts +195 -0
- package/src/columns/index.ts +10 -0
- package/src/columns/types/columnType.ts +8 -0
- package/src/columns/types/pgBigDecimal.ts +29 -0
- package/src/columns/types/pgBigInt.ts +36 -0
- package/src/columns/types/pgBigSerial.ts +36 -0
- package/src/columns/types/pgBoolean.ts +18 -0
- package/src/columns/types/pgEnum.ts +17 -0
- package/src/columns/types/pgInteger.ts +21 -0
- package/src/columns/types/pgJsonb.ts +21 -0
- package/src/columns/types/pgSerial.ts +18 -0
- package/src/columns/types/pgSmallInt.ts +18 -0
- package/src/columns/types/pgText.ts +18 -0
- package/src/columns/types/pgTime.ts +18 -0
- package/src/columns/types/pgTimestamp.ts +18 -0
- package/src/columns/types/pgTimestamptz.ts +18 -0
- package/src/columns/types/pgVarChar.ts +24 -0
- package/src/db/db.ts +43 -0
- package/src/db/dbConnector.ts +30 -0
- package/src/db/dbStringConnector.ts +29 -0
- package/src/db/group_by.ts +75 -0
- package/src/db/index.ts +4 -0
- package/src/db/session.ts +16 -0
- package/src/docs/cases/simple_delete.ts +35 -0
- package/src/docs/cases/simple_insert.ts +65 -0
- package/src/docs/cases/simple_join.ts +140 -0
- package/src/docs/cases/simple_select.ts +72 -0
- package/src/docs/cases/simple_update.ts +40 -0
- package/src/docs/tables/citiesTable.ts +22 -0
- package/src/docs/tables/userGroupsTable.ts +12 -0
- package/src/docs/tables/usersTable.ts +33 -0
- package/src/docs/tables/usersToUserGroups.ts +14 -0
- package/src/docs/types/rolesType.ts +4 -0
- package/src/errors/baseError.ts +47 -0
- package/src/errors/builderError.ts +31 -0
- package/src/errors/dbErrors.ts +24 -0
- package/src/index.ts +20 -0
- package/src/indexes/tableIndex.ts +25 -0
- package/src/logger/abstractLogger.ts +4 -0
- package/src/logger/consoleLogger.ts +11 -0
- package/src/mappers/index.ts +0 -0
- package/src/mappers/responseMapper.ts +46 -0
- package/src/migrator/index.ts +0 -0
- package/src/migrator/migrator.ts +97 -0
- package/src/serializer/serializer.ts +336 -0
- package/src/tables/abstractTable.ts +188 -0
- package/src/tables/index.ts +4 -0
- package/src/tables/inferTypes.ts +67 -0
- package/src/tables/migrationsTable.ts +11 -0
- package/src/types/type.ts +15 -0
- package/src/utils/ecranate.ts +4 -0
- package/tsconfig.json +13 -0
package/.eslintrc
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": ["airbnb-typescript/base"],
|
|
3
|
+
"plugins": ["prefer-arrow"],
|
|
4
|
+
"parserOptions": {
|
|
5
|
+
"project": "./orm/tsconfig.json"
|
|
6
|
+
},
|
|
7
|
+
"rules": {
|
|
8
|
+
"@typescript-eslint/explicit-member-accessibility": "error",
|
|
9
|
+
"@typescript-eslint/lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }],
|
|
10
|
+
"no-underscore-dangle": ["off"],
|
|
11
|
+
"@typescript-eslint/member-ordering": ["error", { "default": [
|
|
12
|
+
"public-field",
|
|
13
|
+
"protected-field",
|
|
14
|
+
"private-field",
|
|
15
|
+
"constructor",
|
|
16
|
+
"static-method",
|
|
17
|
+
"public-method",
|
|
18
|
+
"protected-method",
|
|
19
|
+
"private-method"
|
|
20
|
+
] }],
|
|
21
|
+
"class-methods-use-this": "off",
|
|
22
|
+
"import/no-named-as-default": 0,
|
|
23
|
+
"import/no-named-as-default-member": 0,
|
|
24
|
+
// "prefer-arrow/prefer-arrow-functions": ["error", { "classPropertiesAllowed": true }],
|
|
25
|
+
"import/no-extraneous-dependencies": ["error", { "devDependencies": ["webpack.config.ts"] }],
|
|
26
|
+
"linebreak-style": 0
|
|
27
|
+
}
|
|
28
|
+
}
|
package/.tslintignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*.test.ts
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
### 0.10.6 (Fabruary 06, 2022)
|
|
4
|
+
### Fixes and Functionality:
|
|
5
|
+
- Move from simple query execution to parameterized queries
|
|
6
|
+
### Breaking changes:
|
|
7
|
+
- For `raw` query execution you need to provide values together with query
|
|
8
|
+
#### Previous you could run simple query
|
|
9
|
+
```typescript
|
|
10
|
+
const res: QueryResult<any> = await db.session().execute('SELECT * FROM users WHERE user.id = 1');
|
|
11
|
+
```
|
|
12
|
+
#### Currently you need to provide prepared statement with values as array
|
|
13
|
+
```typescript
|
|
14
|
+
const res: QueryResult<any> = await db.session().execute('SELECT * FROM users WHERE user.id = $1', [1]);
|
|
15
|
+
```
|
|
16
|
+
It's still possible to execute query as before, without providing any values array. But we highly recommend to separate those
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
### 0.10.4 (Fabruary 02, 2022)
|
|
20
|
+
### Fixes and Functionality:
|
|
21
|
+
- Fix `int` and `smallint` mappings from pg driver
|
|
22
|
+
---
|
|
23
|
+
### 0.10.0 (January 27, 2022)
|
|
24
|
+
### Breaking changes:
|
|
25
|
+
- Move limit offset to function calls
|
|
26
|
+
#### Previous limit/offset usage:
|
|
27
|
+
```typescript
|
|
28
|
+
await usersTable.select({limit: 20, offset: 20}).all();
|
|
29
|
+
```
|
|
30
|
+
#### Current limit/offset usage:
|
|
31
|
+
```typescript
|
|
32
|
+
await usersTable.select().limit(20).offset(20).all();
|
|
33
|
+
```
|
|
34
|
+
- Change join calls starting from second one
|
|
35
|
+
|
|
36
|
+
Starting from second join you need to provide table to join from. As long as PostgreSQL has a possibility to join on tables, that already were in previous joins, we need to have a possibility to clarify from which exact table we need to join
|
|
37
|
+
#### Previous join funcition call with parameters:
|
|
38
|
+
```typescript
|
|
39
|
+
await usersToUserGroupsTable.select()
|
|
40
|
+
.where(eq(userGroupsTable.id, 1))
|
|
41
|
+
.leftJoin(UsersTable,
|
|
42
|
+
(userToGroup) => userToGroup.userId,
|
|
43
|
+
(users) => users.id)
|
|
44
|
+
.leftJoin(UserGroupsTable,
|
|
45
|
+
(userToGroup) => userToGroup.groupId,
|
|
46
|
+
(userGroup) => userGroup.id)
|
|
47
|
+
.execute()
|
|
48
|
+
```
|
|
49
|
+
#### Current join funcition call with parameters:
|
|
50
|
+
```typescript
|
|
51
|
+
await usersToUserGroupsTable.select()
|
|
52
|
+
.where(eq(userGroupsTable.id, 1))
|
|
53
|
+
.leftJoin(UsersTable,
|
|
54
|
+
(userToGroup) => userToGroup.userId,
|
|
55
|
+
(users) => users.id)
|
|
56
|
+
.leftJoin(UsersToUserGroupsTable, UserGroupsTable,
|
|
57
|
+
(userToGroup) => userToGroup.groupId,
|
|
58
|
+
(userGroup) => userGroup.id)
|
|
59
|
+
.execute()
|
|
60
|
+
```
|
|
61
|
+
- Create partial select on simple select + on each join
|
|
62
|
+
|
|
63
|
+
If you want to select only specific fields from select request you could provide your own interface with columns to map to:
|
|
64
|
+
#### Example
|
|
65
|
+
```typescript
|
|
66
|
+
const partialSelect = await usersTable.select({
|
|
67
|
+
id: usersTable.id,
|
|
68
|
+
phone: usersTable.phone,
|
|
69
|
+
}).all();
|
|
70
|
+
|
|
71
|
+
// Usage
|
|
72
|
+
const { mappedId, mappedPhone } = partialSelect;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Same could be done with specific columns selecting on joined tables
|
|
76
|
+
#### Example
|
|
77
|
+
```typescript
|
|
78
|
+
const usersWithUserGroups = await usersToUserGroupsTable.select()
|
|
79
|
+
.where(eq(userGroupsTable.id, 1))
|
|
80
|
+
.leftJoin(UsersTable,
|
|
81
|
+
(userToGroup) => userToGroup.userId,
|
|
82
|
+
(users) => users.id,
|
|
83
|
+
// Partial fields to be selected from UsersTable
|
|
84
|
+
{
|
|
85
|
+
id: usersTable.id,
|
|
86
|
+
})
|
|
87
|
+
.leftJoin(UsersToUserGroupsTable, UserGroupsTable,
|
|
88
|
+
(userToGroup) => userToGroup.groupId,
|
|
89
|
+
(userGroup) => userGroup.id,
|
|
90
|
+
// Partial fields to be selected from UserGroupsTable
|
|
91
|
+
{
|
|
92
|
+
id: userGroupsTable.id,
|
|
93
|
+
})
|
|
94
|
+
.execute();
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- Create possibility to have self FK and self joins
|
|
98
|
+
|
|
99
|
+
You could create FK on same table you are creating it from
|
|
100
|
+
#### Example
|
|
101
|
+
```typescript
|
|
102
|
+
public cityId = this.int('city_id').foreignKey(CitiesTable, (table) => table.id, { onUpdate: 'CASCADE' });
|
|
103
|
+
```
|
|
104
|
+
- Delete first() on execution and add findOne(), that will throw an error
|
|
105
|
+
|
|
106
|
+
Previously we had `.first()` function, that was just getting first element from rows returned from `pg` driver
|
|
107
|
+
Right now, invoking `.findOne()` function should check if response contains exactly 1 element in repsponse. If not, it will throw an error
|
|
108
|
+
### Example
|
|
109
|
+
```typescript
|
|
110
|
+
const firstSelect = await usersTable.select().findOne();
|
|
111
|
+
```
|
|
112
|
+
- Fix wrong types. Right now you won't get undefined from select query
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### 0.9.19 (January 24, 2022)
|
|
116
|
+
### Fixes and Functionality:
|
|
117
|
+
- Fix all queries by `Date`
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### 0.9.18 (December 28, 2021)
|
|
122
|
+
### Fixes and Functionality:
|
|
123
|
+
- Fix `any` type returning from `.notNull()` and `.primaryKey()` functions
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### 0.9.17 (December 27, 2021)
|
|
128
|
+
### Fixes and Functionality:
|
|
129
|
+
- Add serializer `fromDb()` method to introspect selected database to drizzle-kit json shanpsot format
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
### 0.9.16 (December 27, 2021)
|
|
133
|
+
### Breaking changes:
|
|
134
|
+
- Delete `autoincrement` type on columns. Right now you should use `serial` type
|
|
135
|
+
|
|
136
|
+
#### Previous serial column defining:
|
|
137
|
+
```typescript
|
|
138
|
+
public id = this.int('id').autoincrement();
|
|
139
|
+
```
|
|
140
|
+
#### Current serial column defining:
|
|
141
|
+
```typescript
|
|
142
|
+
public id = this.serial('id');
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
- Move `notNull` from column type metadata to builder chain
|
|
146
|
+
#### Previous notNull defining:
|
|
147
|
+
```typescript
|
|
148
|
+
public phone = this.varchar('phone', { notNull: true });
|
|
149
|
+
```
|
|
150
|
+
#### Current notNull defining:
|
|
151
|
+
```typescript
|
|
152
|
+
public phone = this.varchar('phone').notNull();
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- Divide `BigInt` into 2 types -> `BigInt53` and `BigInt64`
|
|
156
|
+
- Divide `BigSerial` into 2 types -> `BigSerial53` and `BigSerial64`
|
|
157
|
+
|
|
158
|
+
Due to have max value for big integers in postgres as 2^64 and javascript max value for integers is 2^53
|
|
159
|
+
|
|
160
|
+
If you sure, that value in this column won't be more than 2^53 you could use:
|
|
161
|
+
```typescript
|
|
162
|
+
public bigIntField = this.bigint('test1', 'max_bytes_53');
|
|
163
|
+
```
|
|
164
|
+
that will be of type `number` in typescript
|
|
165
|
+
|
|
166
|
+
If value in this column could be more than 2^53 you could use:
|
|
167
|
+
```typescript
|
|
168
|
+
public bigIntField = this.bigint('test1', 'max_bytes_64');
|
|
169
|
+
```
|
|
170
|
+
that will be of type `bigint` in typescript
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
### Fixes and Functionality:
|
|
174
|
+
- Add `SET NULL` and `SET DEFAULT` for `ON DELETE` and `ON UPDATE` constraints
|
|
175
|
+
|
|
176
|
+
#### Example of usage
|
|
177
|
+
```typescript
|
|
178
|
+
public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onUpdate: 'SET NULL' });
|
|
179
|
+
|
|
180
|
+
public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onDelete: 'SET DEFAULT' });
|
|
181
|
+
```
|
|
182
|
+
- Add default value for timestamp
|
|
183
|
+
```typescript
|
|
184
|
+
public createdAt = this.timestamp('created_at').defaultValue(Defaults.CURRENT_TIMESTAMP);
|
|
185
|
+
```
|
|
186
|
+
- Add `timestamp with timezone` type
|
|
187
|
+
```typescript
|
|
188
|
+
public createdAt = this.timestamptz('created_at');
|
|
189
|
+
```
|
|
190
|
+
- Add migrator function to use `drizzle-kit` generated migrations
|
|
191
|
+
##### Provide drizzle-kit config path
|
|
192
|
+
```typescript
|
|
193
|
+
await drizzle.migrator(db).migrate('src/drizzle.config.yaml');
|
|
194
|
+
```
|
|
195
|
+
##### Provide object with path to folder with migrations
|
|
196
|
+
```typescript
|
|
197
|
+
await drizzle.migrator(db).migrate({ migrationFolder: 'drizzle' });
|
|
198
|
+
```
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
### Documentation:
|
|
202
|
+
- Change README documentation for all changes in current release
|
package/README.md
ADDED
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
# DrizzleORM
|
|
2
|
+
|
|
3
|
+
**DrizzleORM** is an ORM framework for
|
|
4
|
+
[TypeScript](https://www.typescriptlang.org/).
|
|
5
|
+
It offers you several levels of Database communication:
|
|
6
|
+
* Typesafe Table View approach
|
|
7
|
+
* Typesafe Query Builder
|
|
8
|
+
* Simple SQL query execution
|
|
9
|
+
|
|
10
|
+
Drizzle ORM is highly influenced by [Exposed](https://github.com/JetBrains/Exposed) and Jetbrains development methodology
|
|
11
|
+
|
|
12
|
+
## Supported Databases
|
|
13
|
+
|
|
14
|
+
* PostgreSQL
|
|
15
|
+
|
|
16
|
+
## Links
|
|
17
|
+
|
|
18
|
+
In Progress
|
|
19
|
+
|
|
20
|
+
## Installing
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install drizzle-orm drizzle-kit
|
|
24
|
+
```
|
|
25
|
+
#### **In Progress**
|
|
26
|
+
```bash
|
|
27
|
+
yarn add drizzle-orm drizzle-kit
|
|
28
|
+
bower install drizzle-orm drizzle-kit
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Connecting to database
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { DbConnector } from "drizzle-orm";
|
|
35
|
+
|
|
36
|
+
// connect via postgresql connection url
|
|
37
|
+
const db = await new DbConnector()
|
|
38
|
+
.connectionString("postgres://user:password@host:port/db")
|
|
39
|
+
.connect();
|
|
40
|
+
|
|
41
|
+
// or by params
|
|
42
|
+
const db = await new DbConnector()
|
|
43
|
+
.params({
|
|
44
|
+
host: '0.0.0.0',
|
|
45
|
+
port: 5432,
|
|
46
|
+
user: 'user',
|
|
47
|
+
password: 'password',
|
|
48
|
+
db: 'optional_db_name'
|
|
49
|
+
}).connect();
|
|
50
|
+
```
|
|
51
|
+
## Project structure
|
|
52
|
+
- tables folder
|
|
53
|
+
- migrations folder
|
|
54
|
+
|
|
55
|
+
## Create tables
|
|
56
|
+
### Users Table
|
|
57
|
+
---
|
|
58
|
+
```typescript
|
|
59
|
+
|
|
60
|
+
export const rolesEnum = createEnum({ alias: 'test-enum', values: ['user', 'guest', 'admin'] });
|
|
61
|
+
|
|
62
|
+
export default class UsersTable extends AbstractTable<UsersTable> {
|
|
63
|
+
public id = this.serial('id').primaryKey();
|
|
64
|
+
public fullName = this.text('full_name');
|
|
65
|
+
|
|
66
|
+
public phone = this.varchar('phone', { size: 256 });
|
|
67
|
+
public media = this.jsonb<string[]>('media');
|
|
68
|
+
public decimalField = this.decimal('test', { precision: 100, scale: 2 }).notNull();
|
|
69
|
+
public bigIntField = this.bigint('test1', 'max_bytes_53');
|
|
70
|
+
public role = this.type(rolesEnum, 'name_in_table').notNull();
|
|
71
|
+
|
|
72
|
+
public createdAt = this.timestamp('created_at').notNull();
|
|
73
|
+
|
|
74
|
+
public createdAtWithTimezone = this.timestamptz('created_at_time_zone');
|
|
75
|
+
|
|
76
|
+
public updatedAt = this.timestamp('updated_at').defaultValue(Defaults.CURRENT_TIMESTAMP);
|
|
77
|
+
public isArchived = this.bool('is_archived').defaultValue(false);
|
|
78
|
+
|
|
79
|
+
public phoneFullNameIndex = this.index([this.phone, this.fullName]);
|
|
80
|
+
public phoneIndex = this.uniqueIndex(this.phone);
|
|
81
|
+
|
|
82
|
+
public tableName(): string {
|
|
83
|
+
return 'users';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
### Cities Table
|
|
88
|
+
---
|
|
89
|
+
```typescript
|
|
90
|
+
interface CityMeta {
|
|
91
|
+
population: number,
|
|
92
|
+
connection: string,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export default class CitiesTable extends AbstractTable<CitiesTable> {
|
|
96
|
+
public id = this.serial('id').primaryKey();
|
|
97
|
+
|
|
98
|
+
public foundationDate = this.timestamp('name').notNull();
|
|
99
|
+
public location = this.varchar('page', { size: 256 });
|
|
100
|
+
|
|
101
|
+
public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onUpdate: 'CASCADE' });
|
|
102
|
+
|
|
103
|
+
public metadata = this.jsonb<CityMeta>('metadata');
|
|
104
|
+
|
|
105
|
+
public tableName(): string {
|
|
106
|
+
return 'cities';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
### User Groups Table
|
|
111
|
+
---
|
|
112
|
+
```typescript
|
|
113
|
+
export default class UserGroupsTable extends AbstractTable<UserGroupsTable> {
|
|
114
|
+
public id = this.serial('id').primaryKey();
|
|
115
|
+
|
|
116
|
+
public name = this.varchar('name');
|
|
117
|
+
public description = this.varchar('description');
|
|
118
|
+
|
|
119
|
+
public tableName(): string {
|
|
120
|
+
return 'user_groups';
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
### User to User Groups Table
|
|
125
|
+
---
|
|
126
|
+
#### Many to many connection between Users and User Groups
|
|
127
|
+
```typescript
|
|
128
|
+
export default class UsersToUserGroupsTable extends AbstractTable<UsersToUserGroupsTable> {
|
|
129
|
+
public groupId = this.int('city_id').foreignKey(UserGroupsTable, (table) => table.id, { onDelete: 'CASCADE' });
|
|
130
|
+
public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onDelete: 'CASCADE' });
|
|
131
|
+
|
|
132
|
+
public manyToManyIndex = this.index([this.groupId, this.userId]);
|
|
133
|
+
|
|
134
|
+
public tableName(): string {
|
|
135
|
+
return 'users_to_user_groups';
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## CRUD
|
|
141
|
+
### **SELECT**
|
|
142
|
+
---
|
|
143
|
+
```typescript
|
|
144
|
+
const db = await new DbConnector()
|
|
145
|
+
.connectionString('postgresql://postgres@127.0.0.1/drizzle')
|
|
146
|
+
.connect();
|
|
147
|
+
|
|
148
|
+
const usersTable = new UsersTable(db);
|
|
149
|
+
|
|
150
|
+
// select all
|
|
151
|
+
const allSelect = await usersTable.select().all();
|
|
152
|
+
|
|
153
|
+
// select first
|
|
154
|
+
const firstSelect = await usersTable.select().findOne();
|
|
155
|
+
```
|
|
156
|
+
#### **Sorting and Filtering**
|
|
157
|
+
---
|
|
158
|
+
##### Select all records from `Users` where phone is `"hello"`
|
|
159
|
+
```typescript
|
|
160
|
+
const eqSelect = await usersTable.select().where(
|
|
161
|
+
eq(usersTable.phone, 'hello')
|
|
162
|
+
).all();
|
|
163
|
+
```
|
|
164
|
+
##### Select all records from `Users` where **both** phone is `"hello"` **and** phone is `"hello"`
|
|
165
|
+
```typescript
|
|
166
|
+
const andSelect = await usersTable.select().where(
|
|
167
|
+
and([
|
|
168
|
+
eq(usersTable.phone, 'hello'),
|
|
169
|
+
eq(usersTable.phone, 'hello')
|
|
170
|
+
]),
|
|
171
|
+
).all();
|
|
172
|
+
```
|
|
173
|
+
##### Select all records from `Users` where **either** phone is `"hello"` **or** phone is `"hello"`
|
|
174
|
+
```typescript
|
|
175
|
+
const orSelect = await usersTable.select().where(
|
|
176
|
+
or([eq(usersTable.phone, 'hello')]),
|
|
177
|
+
).all();
|
|
178
|
+
```
|
|
179
|
+
##### Select all records from `Users` using **LIMIT** and **OFFSET**
|
|
180
|
+
```typescript
|
|
181
|
+
const limitOffsetSelect = await usersTable.select().limit(10).offset(10).all();
|
|
182
|
+
```
|
|
183
|
+
##### Select all records from `Users` where `phone` contains `"hello"`
|
|
184
|
+
```typescript
|
|
185
|
+
const likeSelect = await usersTable.select().where(
|
|
186
|
+
like(usersTable.phone, '%hello%')
|
|
187
|
+
).all();
|
|
188
|
+
```
|
|
189
|
+
##### Select all records from `Users` where `phone` equals to some of values from array
|
|
190
|
+
```typescript
|
|
191
|
+
const inArraySelect = usersTable.select().where(
|
|
192
|
+
inArray(usersTable.phone, ['hello'])
|
|
193
|
+
).all();
|
|
194
|
+
```
|
|
195
|
+
##### Select all records from `Users` where `phone` greater(**>**) than `"hello"`
|
|
196
|
+
```typescript
|
|
197
|
+
const greaterSelect = usersTable.select().where(
|
|
198
|
+
greater(usersTable.phone, 'hello')
|
|
199
|
+
).all();
|
|
200
|
+
```
|
|
201
|
+
##### Select all records from `Users` where `phone` less(**<**) than `"hello"`
|
|
202
|
+
```typescript
|
|
203
|
+
const lessSelect = usersTable.select().where(
|
|
204
|
+
less(usersTable.phone, 'hello')
|
|
205
|
+
).all();
|
|
206
|
+
```
|
|
207
|
+
##### Select all records from `Users` where `phone` greater or equals(**>=**) than `"hello"`
|
|
208
|
+
```typescript
|
|
209
|
+
const greaterEqSelect = usersTable.select().where(
|
|
210
|
+
greaterEq(usersTable.phone, 'hello')
|
|
211
|
+
).all();
|
|
212
|
+
```
|
|
213
|
+
##### Select all records from `Users` where `phone` less or equals(**<=**)
|
|
214
|
+
```typescript
|
|
215
|
+
const lessEqSelect = usersTable.select().where(
|
|
216
|
+
lessEq(usersTable.phone, 'hello')
|
|
217
|
+
).all();
|
|
218
|
+
```
|
|
219
|
+
##### Select all records from `Users` where `phone` is **NULL**
|
|
220
|
+
```typescript
|
|
221
|
+
const isNullSelect = usersTable.select().where(
|
|
222
|
+
isNull(usersTable.phone)
|
|
223
|
+
).all();
|
|
224
|
+
```
|
|
225
|
+
##### Select all records from `Users` where `phone` not equals to `"hello"`
|
|
226
|
+
```typescript
|
|
227
|
+
const notEqSelect = usersTable.select().where(
|
|
228
|
+
notEq(usersTable.phone, 'hello')
|
|
229
|
+
).all();
|
|
230
|
+
```
|
|
231
|
+
##### Select all records from `Users` ordered by `phone` in ascending order
|
|
232
|
+
```typescript
|
|
233
|
+
const ordered = await usersTable.select().orderBy((table) => table.phone, Order.ASC).all();
|
|
234
|
+
```
|
|
235
|
+
#### **Partial Selecting**
|
|
236
|
+
```typescript
|
|
237
|
+
const partialSelect = await usersTable.select({
|
|
238
|
+
mappedId: usersTable.id,
|
|
239
|
+
mappedPhone: usersTable.phone,
|
|
240
|
+
}).all();
|
|
241
|
+
|
|
242
|
+
// Usage
|
|
243
|
+
const { mappedId, mappedPhone } = partialSelect;
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
### **Update**
|
|
248
|
+
---
|
|
249
|
+
##### Update `fullName` to `newName` in `Users` where phone is `"hello"`
|
|
250
|
+
```typescript
|
|
251
|
+
await usersTable.update()
|
|
252
|
+
.where(eq(usersTable.phone, 'hello'))
|
|
253
|
+
.set({ fullName: 'newName' })
|
|
254
|
+
.execute();
|
|
255
|
+
```
|
|
256
|
+
##### Update `fullName` to `newName` in `Users` where phone is `"hello"` returning updated `User` model
|
|
257
|
+
```typescript
|
|
258
|
+
await usersTable.update()
|
|
259
|
+
.where(eq(usersTable.phone, 'hello'))
|
|
260
|
+
.set({ fullName: 'newName' })
|
|
261
|
+
.all();
|
|
262
|
+
```
|
|
263
|
+
##### Update `fullName` to `newName` in `Users` where phone is `"hello"` returning updated `User` model
|
|
264
|
+
```typescript
|
|
265
|
+
await usersTable.update()
|
|
266
|
+
.where(eq(usersTable.phone, 'hello'))
|
|
267
|
+
.set({ fullName: 'newName' })
|
|
268
|
+
.findOne();
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### **Delete**
|
|
272
|
+
##### Delete `user` where phone is `"hello"`
|
|
273
|
+
```typescript
|
|
274
|
+
await usersTable.delete()
|
|
275
|
+
.where(eq(usersTable.phone, 'hello'))
|
|
276
|
+
.execute();
|
|
277
|
+
```
|
|
278
|
+
##### Delete `user` where phone is `"hello"` returning updated `User` model
|
|
279
|
+
```typescript
|
|
280
|
+
await usersTable.delete()
|
|
281
|
+
.where(eq(usersTable.phone, 'hello'))
|
|
282
|
+
.all();
|
|
283
|
+
```
|
|
284
|
+
##### Delete `user` where phone is `"hello"` returning updated `User` model
|
|
285
|
+
```typescript
|
|
286
|
+
await usersTable.delete()
|
|
287
|
+
.where(eq(usersTable.phone, 'hello'))
|
|
288
|
+
.findOne();
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### **Insert**
|
|
292
|
+
##### Insert `user` with required fields
|
|
293
|
+
```typescript
|
|
294
|
+
await usersTable.insert({
|
|
295
|
+
test: 1,
|
|
296
|
+
createdAt: new Date(),
|
|
297
|
+
}).execute();
|
|
298
|
+
```
|
|
299
|
+
##### Insert `user` with required fields and get all rows as array
|
|
300
|
+
```typescript
|
|
301
|
+
const user = await usersTable.insert({
|
|
302
|
+
test: 1,
|
|
303
|
+
createdAt: new Date(),
|
|
304
|
+
}).all();
|
|
305
|
+
```
|
|
306
|
+
##### Insert `user` with required fields and get inserted entity
|
|
307
|
+
```typescript
|
|
308
|
+
const user = await usersTable.insert({
|
|
309
|
+
test: 1,
|
|
310
|
+
createdAt: new Date(),
|
|
311
|
+
}).findOne();
|
|
312
|
+
```
|
|
313
|
+
##### Insert many `users` with required fields and get all inserted entities
|
|
314
|
+
```typescript
|
|
315
|
+
const users = await usersTable.insertMany([{
|
|
316
|
+
test: 1,
|
|
317
|
+
createdAt: new Date(),
|
|
318
|
+
}, {
|
|
319
|
+
test: 2,
|
|
320
|
+
createdAt: new Date(),
|
|
321
|
+
}]).all();
|
|
322
|
+
```
|
|
323
|
+
##### Insert many `users` with required fields and get all inserted entities. If such user already exists - update `phone` field
|
|
324
|
+
```typescript
|
|
325
|
+
await usersTable.insertMany([{
|
|
326
|
+
test: 1,
|
|
327
|
+
createdAt: new Date(),
|
|
328
|
+
}, {
|
|
329
|
+
test: 2,
|
|
330
|
+
createdAt: new Date(),
|
|
331
|
+
}])
|
|
332
|
+
.onConflict(
|
|
333
|
+
(table) => table.phoneIndex,
|
|
334
|
+
{ phone: 'confilctUpdate' },
|
|
335
|
+
).all();
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Joins
|
|
339
|
+
### Join One-To-Many Tables
|
|
340
|
+
##### Join Cities with Users and map to city object with full user
|
|
341
|
+
```typescript
|
|
342
|
+
const usersTable = new UsersTable(db);
|
|
343
|
+
const citiesTable = new CitiesTable(db);
|
|
344
|
+
|
|
345
|
+
const userWithCities = await citiesTable.select()
|
|
346
|
+
.where(eq(citiesTable.id, 1))
|
|
347
|
+
.leftJoin(UsersTable,
|
|
348
|
+
(city) => city.userId,
|
|
349
|
+
(users) => users.id)
|
|
350
|
+
.execute();
|
|
351
|
+
|
|
352
|
+
const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user }));
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Join Many-To-Many Tables
|
|
356
|
+
##### Join User Groups with Users, using many-to-many table and map response to get user object with groups array
|
|
357
|
+
```typescript
|
|
358
|
+
const usersWithUserGroups = await usersToUserGroupsTable.select()
|
|
359
|
+
.where(eq(userGroupsTable.id, 1))
|
|
360
|
+
.leftJoin(UsersTable,
|
|
361
|
+
(userToGroup) => userToGroup.userId,
|
|
362
|
+
(users) => users.id)
|
|
363
|
+
.leftJoin(UsersToUserGroupsTable, UserGroupsTable,
|
|
364
|
+
(userToGroup) => userToGroup.groupId,
|
|
365
|
+
(users) => users.id)
|
|
366
|
+
.execute();
|
|
367
|
+
|
|
368
|
+
const userGroupWithUsers = usersWithUserGroups.group({
|
|
369
|
+
one: (_, dbUser, dbUserGroup) => dbUser!,
|
|
370
|
+
many: (_, dbUser, dbUserGroup) => dbUserGroup!,
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
const userWithGroups: ExtractModel<UsersTable> & { groups: ExtractModel<UserGroupsTable>[] } = {
|
|
374
|
+
...userGroupWithUsers.one,
|
|
375
|
+
groups: userGroupWithUsers.many,
|
|
376
|
+
};
|
|
377
|
+
```
|
|
378
|
+
##### Join User Groups with Users, using many-to-many table and map response to get user group object with users array
|
|
379
|
+
```typescript
|
|
380
|
+
const usersWithUserGroups = await usersToUserGroupsTable.select()
|
|
381
|
+
.where(eq(userGroupsTable.id, 1))
|
|
382
|
+
.leftJoin(UsersTable,
|
|
383
|
+
(userToGroup) => userToGroup.userId,
|
|
384
|
+
(users) => users.id)
|
|
385
|
+
.leftJoin(UsersToUserGroupsTable, UserGroupsTable,
|
|
386
|
+
(userToGroup) => userToGroup.groupId,
|
|
387
|
+
(users) => users.id)
|
|
388
|
+
.execute();
|
|
389
|
+
|
|
390
|
+
const userGroupWithUsers = usersWithUserGroups.group({
|
|
391
|
+
one: (_, dbUser, dbUserGroup) => dbUserGroup!,
|
|
392
|
+
many: (_, dbUser, dbUserGroup) => dbUser!,
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
const userWithGroups: ExtractModel<UserGroupsTable> & { users: ExtractModel<UsersTable>[] } = {
|
|
396
|
+
...userGroupWithUsers.one,
|
|
397
|
+
users: userGroupWithUsers.many,
|
|
398
|
+
};
|
|
399
|
+
```
|
|
400
|
+
### Join using partial field select
|
|
401
|
+
##### Join Cities with Users getting only needed fields form request
|
|
402
|
+
```typescript
|
|
403
|
+
await citiesTable.select({
|
|
404
|
+
id: citiesTable.id,
|
|
405
|
+
userId: citiesTable.userId,
|
|
406
|
+
})
|
|
407
|
+
.where(eq(citiesTable.id, 1))
|
|
408
|
+
.leftJoin(UsersTable,
|
|
409
|
+
(city) => city.userId,
|
|
410
|
+
(users) => users.id,
|
|
411
|
+
{
|
|
412
|
+
id: usersTable.id,
|
|
413
|
+
})
|
|
414
|
+
.execute();
|
|
415
|
+
|
|
416
|
+
const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user }));
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
## Migrations
|
|
421
|
+
#### To run migrations generated by drizzle-kit you could use `Migrator` class
|
|
422
|
+
##### Provide drizzle-kit config path
|
|
423
|
+
```typescript
|
|
424
|
+
await drizzle.migrator(db).migrate('src/drizzle.config.yaml');
|
|
425
|
+
```
|
|
426
|
+
##### Another possibility is to provide object with path to folder with migrations
|
|
427
|
+
```typescript
|
|
428
|
+
await drizzle.migrator(db).migrate({ migrationFolder: 'drizzle' });
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
## Raw query usage
|
|
433
|
+
#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
##### Execute custom raw query
|
|
437
|
+
```typescript
|
|
438
|
+
const res: QueryResult<any> = await db.session().execute('SELECT * FROM users WHERE user.id = $1', [1]);
|
|
439
|
+
```
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AbstractColumn } from '../../columns/column';
|
|
2
|
+
import ColumnType from '../../columns/types/columnType';
|
|
3
|
+
import { AbstractTable } from '../../tables';
|
|
4
|
+
export default class Aggregator {
|
|
5
|
+
protected _fields: Array<string>;
|
|
6
|
+
protected _table: AbstractTable<any>;
|
|
7
|
+
constructor(table: AbstractTable<any>, partial?: {
|
|
8
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, AbstractTable<any>>;
|
|
9
|
+
});
|
|
10
|
+
protected generateSelectArray: (table: string, columns: AbstractColumn<ColumnType>[], id?: number | undefined) => string[];
|
|
11
|
+
}
|