Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question: Update enum column types in knex migration #1699

Open
reggi opened this issue Sep 27, 2016 · 20 comments
Open

Question: Update enum column types in knex migration #1699

reggi opened this issue Sep 27, 2016 · 20 comments

Comments

@reggi
Copy link

reggi commented Sep 27, 2016

Stackoverflow

I'm looking to write a migration string to add a new string to the enum column type. I'm trying to add gamma to the service column.

I tried with this code below. This collides because the table and the column already exists.

const table = 'user_associations'

export function up (knex, Promise) {
  return knex.schema.table(table, function (table) {
    table.enu('service', ['alpha', 'beta', 'gamma']).notNullable()
  })
}

export function down (knex, Promise) {
  return knex.schema.table(table, function (table) {
    table.enu('service', ['alpha', 'beta']).notNullable()
  })
}
@ebramanti
Copy link

Bump on this, any way to use the alter API?

@elhigu
Copy link
Member

elhigu commented Mar 5, 2017

enums are done with check constraints currently and .alter() doesn't have any special treatment for them...

One problem is that .alter() doesn't know what is the original type of the column and thats why it doesn't know if it should drop the old check constraint of enum.

As far as I know currently one can change the allowed enum values only with knex.rawby dropping old and creating new check constraint...

I think it could be implemented by some drop old constraint if exist and then create new one if the altered type of the column is enum.

I would love to see this feature being implemented.

@ebramanti
Copy link

@elhigu I wrote a custom enum query so that I could use Postgres enums, however there is some debate in the Postgres community about check conditions vs enums

@holloway
Copy link

holloway commented Jul 5, 2018

Just for anyone wanting to know how the code might look in Postgres 9

const formatAlterTableEnumSql = (
  tableName,
  columnName,
  enums,
) => {
  const constraintName = `${tableName}_${columnName}_check`;
  return [
    `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${constraintName};`,
    `ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} CHECK (${columnName} = ANY (ARRAY['${enums.join(
      "'::text, '"
    )}'::text]));`,
  ].join('\n');
};


exports.up = async function up(knex) {
  await knex.raw(
    formatAlterTableEnumSql('myTableName', 'myColumnName', [
      'enum1',
      'enum2',
      'enum3',
    ])
  );
};

exports.down = async function down(knex) {
  await knex.raw(
    formatAlterTableEnumSql('myTableName', 'myColumnName', [
      'enum1',
      'enum2',
    ])
  );
};

jpqy added a commit to Folkwise-io/MintbeanplatformV3-backend that referenced this issue Oct 16, 2020
An enum constraint for `templateName` on the db would be hard to change
during migrations (see knex/knex#1699). Thus, it makes sense to offload
the enum constraint to TS and ensure we only use the TS enum instead of
the string literal in our code to achieve the same safety.
@Jordan24
Copy link

@holloway Thanks for the migration code example. Just what I was looking for. I'm running into one issue though. 'myColumnName' is throwing an error when migrating. The message says "column 'mycolumnname' does not exist". Notice the camelCase is now missing. Any ideas on how to get around that?

@kibertoad
Copy link
Collaborator

@Jordan24 Can you share your code?

@Jordan24
Copy link

'use strict';

const formatAlterTableEnumSql = (tableName, columnName, enums) => {

  const constraintName = `${tableName}_${columnName}_check`;
  return [
    `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${constraintName};`,
    `ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} CHECK (${columnName} = ANY (ARRAY['${enums.join(
      `'::text, '`
    )}'::text]));`
  ].join('\n');
};


exports.up = async function up(knex) {

  await knex.raw(
    formatAlterTableEnumSql('item_messages', 'sentMethod', [
      'Web App', 'Email', 'Text Message', 'Log Conversation'
    ])
  );
};

exports.down = async function down(knex) {

  await knex.raw(
    formatAlterTableEnumSql('item_messages', 'sentMethod', [
      'Web App', 'Email', 'Text Message'
    ])
  );
};

@Jordan24
Copy link

If I wrap the columnName in double quotes I get a syntax error because the single quotes aren't removed in the raw code.
I think I might drop the function and just write the raw code out twice.

@kibertoad
Copy link
Collaborator

@Jordan24 Without the quotes PostgreSQL folds all identifiers to lowercase.

@Jordan24
Copy link

Hard coded all but the 'enum' to get around it. Thanks for the tip @kibertoad!

@machineghost
Copy link
Contributor

machineghost commented Mar 8, 2021

Any news on this?

If there's no fix coming, could we just get a single line added to the documentation for .enum ... something to the effect of:

Knex does not provide a way to alter migrations after the fact, so you must use Knex.raw and the appropriate command for your database to alter any enumerations after they are created.

?

@kibertoad
Copy link
Collaborator

@machineghost PR for this would be most welcome :)

@machineghost
Copy link
Contributor

@machineghost PR for this would be most welcome :)

How does one submit a documentation PR? I don't see any files for the website in the main repo: is there a separate one for the documentation site?

@kibertoad
Copy link
Collaborator

@liaison-victor
Copy link

I added the double quotes to $tableName and $constraintName and it worked!

@sam-super
Copy link
Contributor

This issue is still helping people (me) all this time later 🤣

In case it helps anyone else further, i had to adapt @Jordan24's example like so in typescript (also solves the casing issue):

function formatAlterTableEnumSql(tableName: string, columnName: string, enums: string[]): string {
  const constraintName = `${tableName}_${columnName}_check`;
  const checkValues = enums.map((enu) => {
    return `'${enu}'::text`;
  });
  const checkValuesString = checkValues.join(', ');
  return `
    ALTER TABLE "${tableName}" DROP CONSTRAINT IF EXISTS "${constraintName}";
    ALTER TABLE "${tableName}" ADD CONSTRAINT "${constraintName}" CHECK ("${columnName}" = ANY (ARRAY[${checkValuesString}]));
  `;
}

@ianchanning
Copy link

@holloway Thanks for the migration code example. Just what I was looking for. I'm running into one issue though. 'myColumnName' is throwing an error when migrating. The message says "column 'mycolumnname' does not exist". Notice the camelCase is now missing. Any ideas on how to get around that?

Just to clarify as I didn't understand at first - I thought there was a problem with the script.

If your column names are snake case like my_column_name then @holloway 's comment script should work fine. It's only if you have myColumnName that you hit problems.

@ianchanning
Copy link

ianchanning commented Jan 26, 2023

With @holloway 's script I got the following error:

migration failed with error: ALTER TABLE screenings ADD CONSTRAINT screenings_status_check CHECK (status = ANY (ARRAY['CREATED'::text, 'NEEDS_REVIEW'::text, 'ARCHIVED'::text, 'FAILED'::text])); - check constraint "screenings_status_check" of relation "screenings" is violated by some row

This is because I am renaming NEEDS_REVIEW status to REVIEW. Instead of just adding a new enum, I am adding a new enum, but also deleting an old enum. You will need to something similar if you are only deleting an enum.

What I needed to do was roughly DROP CONSTRAINT , UPDATE, ADD CONSTRAINT. With some minor refactoring I was able to re-use the core function.

Also I did a further refactor to the code for the constraint array:

ARRAY[${enums.map((e) => `'${e}'::text`).join(',')}]

This removes the duplicate ::text and having to wrap it all in '' - I just spotted that @sam-super did something similar in his code.

const oldEnum = { my_column_name: 'OLD_VALUE' }
const newEnum = { my_column_name: 'NEW_VALUE' }

const enumConstraintName = (tableName, columnName) =>
    `${tableName}_${columnName}_check`
const dropEnumConstraint = (tableName, columnName) =>
    `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${enumConstraintName(
        tableName,
        columnName
    )};`
const addEnumConstraint = (tableName, columnName, enums) =>
    `ALTER TABLE ${tableName} ADD CONSTRAINT ${enumConstraintName(
        tableName,
        columnName
    )} CHECK (${columnName} = ANY (ARRAY[${enums
        .map((e) => `'${e}'::text`)
        .join(',')}]));`

/**
 * SQL to replace Knex enum constraint for Postgres
 *
 * @param {string} tableName Postgres table name - assumes lowercase / snake_case
 * @param {string} columnName Postgres column name - assumes lowercase / snake_case
 * @param {string[]} enums Enum values
 * @returns {string} Raw SQL statement
 * {@link https://github.com/knex/knex/issues/1699#issuecomment-402603481}
 *
 * Get this error if you don't use this function:
 *
 * > migration file "20230126110521_migration.js" failed
 * > migration failed with error: update "my_table_name" set "my_column_name" = $1 where "my_column_name" = $2 - new row for relation "my_table_name" violates check constraint "my_table_name_my_column_name_check"
 * {@link https://stackoverflow.com/questions/39714345/update-enum-column-types-in-knex-migration}
 */
const formatAlterTableEnumSql = (tableName, columnName, enums) =>
    [
        dropEnumConstraint(tableName, columnName),
        addEnumConstraint(tableName, columnName, enums),
    ].join('\n')

export const up = async (knex) => {
    // OLD_VALUE => NEW_VALUE
    await knex
        .raw(dropEnumConstraint('my_table_name', 'my_column_name'))
        .then(() => knex('my_table_name').where(oldEnum).update(newEnum))
        .then(() =>
            knex.raw(
                addEnumConstraint('my_table_name', 'my_column_name', [
                    'enum1',
                    'enum2_new',
                    'enum3',
                ])
            )
        )
}

export const down = async (knex) => {
    // NEW_VALUE => OLD_VALUE
    await knex
        .raw(dropEnumConstraint('my_table_name', 'my_column_name'))
        .then(() => knex('my_table_name').where(newEnum).update(oldEnum))
        .then(() =>
            knex.raw(
                addEnumConstraint('my_table_name', 'my_column_name', [
                    'enum1',
                    'enum2',
                    'enum3',
                ])
            )
        )
}

export default {
    up,
    down,
}

@paul4156
Copy link

Any updates on this feature? 🙏

rluvaton added a commit that referenced this issue Mar 2, 2024
* Build documentation for 0.17.0 (#198)

* Add documentation for migrate:down (#197)

* add missing function to sidebar (#199)

* Add notes around usage with typescript

* Generate assets

* Fix documentation for migration extension (#204)

* Improve dev workflow (#201)

* Mark generated files as binary so they don't clobber the diff

* Tweak build scripts

- Replace child-process-promise with execa which already handles SIGINT propagation & PATHEXT normalization
- Read CHANGELOG from node_modules/knex so that it works well with npm/yarn link and nodemon can pickup changes
- Tweak nodemon to auto restart when CHANGELOG changes
- Remove misleading log that rs will restart nodemon which doesn't work with spawn

* fix typo (#206)

* add intersect method (#173)

* Document transaction execution promise (#205)

* Generate documentatino for 0.18.0 (#207)

* Fix typo (#209)

Remove unnecessary parentheses

* CLI: documentation on migration:make --stub option (#208)

* Update dependencies (#210)

* Build documentation for 0.18.3 (#211)

* Add docs for seed:run --specific (#213)

* Build documentation for 0.18.4 (#215)

* Update docs for aggregation queries to include information about #3354 (#221)

Closes #219

* Document "skipLocked()" and "noWait()" (#186)

* Remove bluebird-specific methods from documentation (#222)

* Add documentation for transaction .isCompleted() (#223)

* Add extends queryBuilder documentation - related to #3334 (#218)

* Build documentation for 0.19.1 (#224)

* fix(syntax error): small issue with docs displaying invalid JS code. (#225)

* correct and clarify how to alias an identifier (#226)

* noted that aliasing uses a suffix, not a prefix
* added an example

* Fix small type (#229)

* CLI Migrations List CMD Documentation (#231)

* Support specifying schema for enums (#232)

* Release documentation for 0.19.3

* update docs as per #3416 (#233)

* Docs for disableValidateMigrationsList (#237)

* fix docs for knex.migrate.up & knex.migrate.down (#238)

* Edit table names in example to be plural (#236)

Change table names to be plural to match the style in the rest of the documentation.

* fix: repair hitchhikers guide to the galaxy update docs (#230)

* Fix broken travis badge and links after relocation of project (#240)

* replace deprecated oracle package with oracledb (#239)

* Release documentation for 0.20.0

* Documentation for #3497 (#242)

* Release documentation for 0.20.1

* Update to Babel 7, bump a couple of other dependencies

* Release documentation for 0.20.4

* Release documentation for 0.20.5

* updated transactions docs with async/await examples (#247)

* "esm module interop flag" reflects knex #3571 (#251)

* Release documentation for 0.20.10

* Release documentation for 0.20.10 - follow-up

* delete Promise.return (#256)

* Adds documentation for async knex (#259)

* Add clearGroup method documentation (#261)

* Add entry for onDistinct (#257)

* Add join to sidebar (#264)

* Change notNull to notNullable for consistency (#252)

* Release documentation for 0.20.15

* Release documentation for 0.21.0

* Add documentation about liftoff and its dependencies. Resolves #3807 (#265)

* Add docs for new migrate:unlock command (#266)

Corresponding knex PR: #3822

Co-authored-by: Zach McElrath <zach@skuid.com>

* Release documentation for 0.21.1

* remove broken link from sidebar (#269)

* pronounced /kəˈnɛks/ (#275)

* Typo fix in schema.js (#279)

* Add array of paths and sortDirsSeparately for seeds (#282)

related to #3967 and knex/documentation#220

* Release documentation for 0.21.3

* Add recursive option for seeds (#284)

Related to #3974

* Release documentation for 0.21.4

* Esm interop documentation update (#285)

* Release documentation for 0.21.5

* Typo in index.html (#291)

* add documentation for isTransaction property (#293)

closes knex/documentation#235

* docs(QueryBuilder): add method .clear(statement) (#289)

* Release documentation for 0.21.9

* Documentation for augmented table interfaces (#292)

* Initial documentation on .onConflict, .ignore, and .merge (#260)

* Release documentation for 0.21.10

* Fix spelling error (#296)

* Add documentation on "upsert" WHERE clause for PostgreSQL/Sqlite (#300)

Co-authored-by: Igor Savin <iselwin@gmail.com>

* Release documentation for 0.21.13

* Add documentation for "includeTriggerModifications" (#301)

* Release documentation for 0.21.14

* Minor tweaks on the main page

* Release documentation for 0.21.15

* var -> const
http -> https
Minor tweaks

* Add setIsolationLevel docs (#302)

Co-authored-by: Igor Savin <iselwin@gmail.com>

* Update TypeScript documentation (#303)

* Doc for analytic functions (#5)

Co-authored-by: Igor Savin <iselwin@gmail.com>

* Document optimizer hints (#306)

* Added documentation for increments primaryKey option (#308)

Co-authored-by: Igor Savin <iselwin@gmail.com>

* Added docs for new conflict merge strategies. (#307)

Co-authored-by: Matt Goodson <matt.goodson.business@gmail.com>

* fix WebpackMigrationSource example (#192) (#304)

* Add example for WebpackMigrationSource with webpack 5 (#310)

* DOCS Add constraintName option to defaultTo for mssql driver (#311)

* DOCS Add constraintName option to defaultTo for mssql driver

* Update schema.js

Co-authored-by: Igor Savin <iselwin@gmail.com>

* columnInfo: Fix bulleted list rendering (#312)

* include enlightenment about composite typing (#298)

* Add documentation for generateDdlCommands
update TOC

* Publish documentation for 0.95.0

* Fix migrate parameter (#313)

latestVersion becomes latest

* Docs for #3678: allow running multiple specific seed files (#316)

* Add documentation for "Add support for file open flags for sqlite3" (#320)

Signed-off-by: Boelensman1 <me@wiggerboelens.com>

* fixed typescript example of extending QueryBuilder (#321)

* Publish documentation for 0.95.5

* fix(docs): migration from mssql to tedious (#317)

* Fix mssql driver description

* Fix typo (#328)

* add documentation for deferrable constraint support (#330)

* Fix Sidebar element link to same section (#331)

* Publish documentation for 0.95.8

* Add documentation for partitionBy and clean up some spacings and child assigns (#333)

* Fix example for batch insert with conflict merge (#325)

* add port option to connection (#324)

* Adds a missing "the" (#318)

* Add documentation for schema nullability manipulation (#334)

* Publish documentation for 0.95.11

* feat(builder): Describe optional columnList arg to with/Recurisve [#4514] (#335)

* Add missing documentation for whereRecursive

* Adding notes about pg-native (#336)

* Add table.double to documentation (#295)

* Fix havingRaw signature (#297)

* Add dropSchema and dropSchemaIfExists doc (#4713) (#338)

* Add 'is null' support in order by documentation (#339)

* Missing comma (#340)

* Add Create table like documentation (#1373) (#341)

* Add CockroachDB (#342)

* Migrations: Fix code formatting (#343)

* View support doc (#4748) (#344)

Co-authored-by: Olivier CAVADENTI <ocavadenti@cirilgroup.com>

* Add storage engine index type doc #4756 (#345)

* Add docs for forNoKeyUpdate() and forKeyShare() (#346)

* skiplocked and nowait in mariadb (#348)

Nowait was added in 10.3 - https://mariadb.com/kb/en/wait-and-nowait/

skiplocked was added in 10.6 - https://mariadb.com/kb/en/select/#skip-locked

* feat: add builder method upsert (#349)

* Add partial index doc #4768 (#350)

* github url fix to github.com/knex/knex (#347)

* Publish documentation  for 0.95.12

* Add documentation fromRaw #4781 (#354)

* Add documentation whereLike/whereILike #4779 (#353)

* Add doc for Delete joins and using syntax in Postgres

* Add skipBinding option for offset and limit (#356)

* Add callback doc for create table like (#359)

* Update builder.js (#360)

* Remove dead link in sidebar (#361)

* Added a note about enumerations not being editable after creation (without knex.raw), as per #1699 (#314)

* Document custom seed sources (#364)

* Webpack 5 update (#365)

* remove -p parameter of webpack command

* React, Babel and more updates (#366)

* Add binary uuid doc (#368)

* docs: added some small additions about supporting `better-sqlite3` (#369)

Signed-off-by: blam <ben@blam.sh>

* Add useCamelCase doc (#358)

* Add geo columns doc (#370)

* Add alter table and fixes (#371)

* fix typo in `dropView` (#372)

* Added MSSQL unique constraint documentation (#373)

* Json Support documentation (#374)

* Multiple PKs with increments doc (#375)

* Add checks documentation (#377)

* Update returning doc (#378)

* Create or replace view doc (#376)

* add docs aout smallint, integer, biginteger, tinyint, mediumint (#363)

* href Schema.index vs column.index (#355)

* Publish documentation for 1.0.1

* Fix 1.0.1 documentation

* Update SQLite driver documentation (#381)

* Add with materialized doc (#382)

* Add onConflict raw doc (#384)

* docs: add built assets

* Add alterNullable doc (#385)

* Add alterType documentation (#387)

* Publish documentation for 1.0.2

* Publish documentation for 1.0.3

* Add whereLike functions doc (#392)

* Update CNAME

* Delete CNAME

* Create CNAME

* Publish documentation for 1.0.3\4

* Update CNAME

* Wrong doc reference for table.index (#394)

* Update Migrations doc for overrides cli (#395)

* Publish documentation for 1.0.5

* Publish documentation for 1.0.6

* Publish documentation for 1.0.7

* Update esm-interop.js (#398)

* Update doc for sqlite3 restore (#399)

* Publish documentation for 2.0.0

* Delete everything

* Migrate documentation to vitepress (#400)

Co-authored-by: Benicio Cardozo <beniciocardozomdp@gmail.com>

* feat: add deployment workflow (#404)

* Update schema-builder.md (#405)

* Update deploy.yml (#407)

* Added recommendation to set pool.min to 0 (#409)

* Fix Algolia Search Box redirecting to a 404 page (#411)

* Update transactions.md (#416)

* restore sqlite3 as the version to install for sqlite db (#418)

* docs: document primaryKey option on uuid type (#419)

* Typo (#422)

* Fix typo (#426)

* Fix a few broken links (#430)

Propably the consequence of a change in structure

* uuidToBin and binToUuid are switched (#434)

The code examples of uuidToBin and binToUuid where in the wrong order. I switched the heading and description of both so the createTable and  select statements are still correct.
I also changed 'convert a uuid (char(16))' to 'convert a string uuid (char(36))' in uuidToBin to match the description of binToUuid and the corresponding code example.
In addition I changed the specified language of the binToUuid code example from ts to js to match the language definitions of the other code examples.

* add documentation about compileSqlOnError (#436)

* Update .returning documentation to include SQLite support (#438)

This documentation update corresponds to the changes implemented in [knex/knex pull request #5285](#5285).

* add documentation for mapBinding (#440)

* docs: explicit jsonb suppor for custom pg clients (#423)

* fix a link reference (#451)

* docs: update predicate, useConstraint options in unique() (#449)

* Updated index.md (#460)

removed word 'the' before 'any' in migrations section

* fix documentation about compileSqlOnError (#463)

* raw.md typo fix (#452)

* Fix invalid bold (#461)

There was another `*` stopping a line from going bold. I fixed that.

* fix parameter order in function example (#446)

* Updating port (#470)

* Fix typo `unqiue` (#477)

* Add documentation on comment. (#450)

* Document Better-SQLite3 nativeBinding option (#504)

* Bump knex from 2.0.0 to 2.4.0 (#485)

Bumps [knex](https://github.com/knex/knex) from 2.0.0 to 2.4.0.
- [Release notes](https://github.com/knex/knex/releases)
- [Changelog](https://github.com/knex/knex/blob/master/CHANGELOG.md)
- [Commits](2.0.0...2.4.0)

---
updated-dependencies:
- dependency-name: knex
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update Changelog and fix deadlinks (#506)

* Bump vite from 2.9.9 to 2.9.15 (#448)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 2.9.9 to 2.9.15.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v2.9.15/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v2.9.15/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Typo/Grammar (#491)

Documentation grammar. `An` not required in this case--even though it precedes a vowel.

* fix doc typo (#482)

* Fix spacing typos (#467)

* Fix erroneous basic config example (#443)

Fixes the example of how to use an async function to get connection details.

The current example shows you can export an async function returning an entire [`Config`](https://github.com/knex/knex/blob/2dadde4214d9ee333adccfa517089647e94d23be/types/index.d.ts#L2698) object. However, the [type definition](https://github.com/knex/knex/blob/2dadde4214d9ee333adccfa517089647e94d23be/types/index.d.ts#L2703) shows that the `connection` property can be an async function. I can confirm that TypeScript won't compile when following the current example.

* Improve documentation for extending QueryBuilder (#462)

Changes made:
1. Changed variable where `QueryBuilder` class is located at. `Knex.QueryBuilder` is a typescript interface defined in `Knex` namespace. `QueryBuilder` class is located at `knex.QueryBuilder`.
2. Changed `QueryBuilder` interface to `QueryInterface` in custom typescript definitions. To make the custom method appear at `knex()` object, we should augment `QueryInterface`, since it's the type `Knex` interface extends.

* adds documentation about how to group and order inputs to a union (#500)

* adds documentation about how to group and order inputs to a union

* provide links to query lab for example

* docs: reference to issues in changelog (#420)

* docs: reference to issues in changelog

* reference issues in last changelogs

---------

Co-authored-by: Olivier Cavadenti <olivier.cavadenti@gmail.com>

* Update all remaining issues links in changelog (#507)

* Fix issues links (#508)

* Fix links (#509)

Co-authored-by: Garrit Franke <32395585+garritfra@users.noreply.github.com>

* Fix url esm-interop (#517)

* Document Better-SQLite3 readonly option (#505)

* Update transactions.md (#489)

* docs(pg): document QueryBuilder#updateFrom (#476)

* docs: document uuid utility function (#527)

* Update changelog for 2.5.0

(cherry picked from commit 063b380c76f6990b0c3a1470876e0781dbc98d6a)

* Fix changelog title release

* docs(pg): terminate code block in query-builder.md (#528)

* docs: provide more usage patterns for Knex configuration object (#529)

* Update changelog for 2.5.1

* Bump vite from 2.9.15 to 2.9.16 (#523)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 2.9.15 to 2.9.16.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v2.9.16/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v2.9.16/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add note regarding timestamps() for Postgres users (#475)

* fix doc typo (#474)

* Adding ability to have a custom getNewMigrationName function. (#484)

* add stream as iterator part (#454)

* Update documentation to include except keyword (#468)

* Update schema-builder.md (#432)

* Added extending docs (#414)

* docs: add TypeScript module augmentation help (#531)

* Move website deployment to root and run only on docs changes

* run format on the docs folder

* update links

* Update CONTRIBUTING.md

Co-authored-by: Igor Savin <iselwin@gmail.com>

* use npm instead of yarn

---------

Signed-off-by: Boelensman1 <me@wiggerboelens.com>
Signed-off-by: blam <ben@blam.sh>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Igor Savin <iselwin@gmail.com>
Co-authored-by: Lee Allen <leeallen337@gmail.com>
Co-authored-by: Daniel Mills <mills.dma@gmail.com>
Co-authored-by: Lorefnon <lorefnon@gmail.com>
Co-authored-by: EthanHur <ethan0311@gmail.com>
Co-authored-by: Matthew Kuo <matthewjkuo@gmail.com>
Co-authored-by: Daniel Norman <daniel@2color.me>
Co-authored-by: Vamp <25523682+the-vampiire@users.noreply.github.com>
Co-authored-by: Felix Mosheev <9304194+felixmosh@users.noreply.github.com>
Co-authored-by: Ricardo Maes <ricmzn@gmail.com>
Co-authored-by: Matthew Kuo <matthew.kuo@dialexa.com>
Co-authored-by: Joe Warner <joe.warner143@live.co.uk>
Co-authored-by: julescubtree <julescubtree@users.noreply.github.com>
Co-authored-by: Anton Sitnikov <colmer@yandex.ru>
Co-authored-by: Vithalreddy.M.B <vmreddyvmb@gmail.com>
Co-authored-by: Taras Ozarko <ivanovych666@gmail.com>
Co-authored-by: Nekrasov Ilya <nekrasov.ilya90@gmail.com>
Co-authored-by: Nima Boscarino <nima.boscarino@gmail.com>
Co-authored-by: Micheal Winger <mike.winger87@gmail.com>
Co-authored-by: maximelkin <maxelkin@list.ru>
Co-authored-by: Oran Epelbaum <oran@epelbaum.me>
Co-authored-by: Igor Savin <kibertoad@gmail.com>
Co-authored-by: Jan Swist <swistjan@gmail.com>
Co-authored-by: Mr D <daniel@australis-technica.com>
Co-authored-by: Florent Vilmart <364568+flovilmart@users.noreply.github.com>
Co-authored-by: Edvaldo Szymonek <edvaldoszy@gmail.com>
Co-authored-by: Jonas Gebhardt <jonas.gebhardt@gmail.com>
Co-authored-by: Niek <ngnijland@gmail.com>
Co-authored-by: Matthew Leffler <mattleff@gmail.com>
Co-authored-by: Zach McElrath <zach@skuidify.com>
Co-authored-by: Zach McElrath <zach@skuid.com>
Co-authored-by: Danial Malik <danialmalik321@gmail.com>
Co-authored-by: Rico Kahler <ricokahler@me.com>
Co-authored-by: Eli Geller <elitree@gmail.com>
Co-authored-by: Mathieu DARTIGUES <mathieu@dartic.fr>
Co-authored-by: Ludovic HOCHET <lhochet@gmail.com>
Co-authored-by: Tizian Adam <tizian.adam@mailbox.org>
Co-authored-by: Ivan Zhuravlev <intech@users.noreply.github.com>
Co-authored-by: Arturs Vonda <github@artursvonda.lv>
Co-authored-by: Nico Burns <nico@nicoburns.com>
Co-authored-by: Jess Martin <jessmartin@gmail.com>
Co-authored-by: Mark Boyd <markdavidboyd@gmail.com>
Co-authored-by: Kkmatt11 <kaleb.matthews@withone.vision>
Co-authored-by: Ben Lu <ayroblu@gmail.com>
Co-authored-by: CorvusCorrax <renaud.cayol@gmail.com>
Co-authored-by: martinmacko47 <martinmacko47@users.noreply.github.com>
Co-authored-by: George Petrov <george@dmxzone.com>
Co-authored-by: Matt <mpgoodson1@gmail.com>
Co-authored-by: Matt Goodson <matt.goodson.business@gmail.com>
Co-authored-by: Joshua Weiss <jtw@joshuatweiss.com>
Co-authored-by: Daniel Ferenc Balogh <danielferencortel@gmail.com>
Co-authored-by: Daniel Hensby <dhensby@users.noreply.github.com>
Co-authored-by: Jeremy W. Sherman <jeremyw.sherman@gmail.com>
Co-authored-by: Isaac Batista <isaacbatst@gmail.com>
Co-authored-by: Jérémy Lal <kapouer@melix.org>
Co-authored-by: Benedict Tesha <benedict.tesha@jamaatech.com>
Co-authored-by: Wigger Boelens <me@wiggerboelens.com>
Co-authored-by: Jonathan <barroudjo@gmail.com>
Co-authored-by: Huseyin ELMAS <hsynlms47@gmail.com>
Co-authored-by: Bruno P. Kinoshita <kinow@users.noreply.github.com>
Co-authored-by: zeotuan <48720253+zeotuan@users.noreply.github.com>
Co-authored-by: wolfcomp <magnus1997.MHO@gmail.com>
Co-authored-by: Mathias Lundell <luddd3@users.noreply.github.com>
Co-authored-by: Ahacad <51874356+Ahacad@users.noreply.github.com>
Co-authored-by: Alan Andrade <alan.andradec@gmail.com>
Co-authored-by: Matt Machuga <machuga@users.noreply.github.com>
Co-authored-by: Dustin Wheeler <mdwheele@gmail.com>
Co-authored-by: Orhan Toy <toyorhan@gmail.com>
Co-authored-by: Olivier Cavadenti <olivier.cavadenti@gmail.com>
Co-authored-by: Flleeppyy <18307183+flleeppyy@users.noreply.github.com>
Co-authored-by: Adam Burgess <adamburgess@users.noreply.github.com>
Co-authored-by: Olivier CAVADENTI <ocavadenti@cirilgroup.com>
Co-authored-by: Dominik Krejcik <dominik.krejcik@gmail.com>
Co-authored-by: Daniel Black <daniel@mariadb.org>
Co-authored-by: Jiří Hofman <jiri.hofman@gmail.com>
Co-authored-by: Seth Holladay <me@seth-holladay.com>
Co-authored-by: Jeremy Walker <machineghost@gmail.com>
Co-authored-by: Ben Lambert <blam@spotify.com>
Co-authored-by: Shane A. Stillwell <shane@northernv.com>
Co-authored-by: Marat Levit <mlevit@gmail.com>
Co-authored-by: Manda Putra <mandaputra8@gmail.com>
Co-authored-by: Richard <github@naddiseo.ca>
Co-authored-by: Tim Griesser <tgriesser10@gmail.com>
Co-authored-by: Alex Pavlovich <alexpimt1917@gmail.com>
Co-authored-by: Owen Allen <owenallenaz@gmail.com>
Co-authored-by: Sacha STAFYNIAK <sacha.stafyniak@gmail.com>
Co-authored-by: Benicio Cardozo <beniciocardozomdp@gmail.com>
Co-authored-by: Peiman Nourani <nourani.peiman@gmail.com>
Co-authored-by: Andres Kalle <mjomble@gmail.com>
Co-authored-by: 찰스 <osairis100@gmail.com>
Co-authored-by: Lucas Bickel <116588+hairmare@users.noreply.github.com>
Co-authored-by: Felix Wehnert <flashspys@gmail.com>
Co-authored-by: Phạm Thành Trung <adamward459@gmail.com>
Co-authored-by: Bruno Enten <bruno@enten.me>
Co-authored-by: Tobias Jäger <Tobias.Jaeger@slidetex.de>
Co-authored-by: Jakob Joonas <97440054+JakobJoonas@users.noreply.github.com>
Co-authored-by: Simon Plenderleith <simon@simonplend.co.uk>
Co-authored-by: Kelly Bourg <75750051+kellyrbourg@users.noreply.github.com>
Co-authored-by: Hasnae <viqueen@users.noreply.github.com>
Co-authored-by: Woosik Kim <iam.woosik.kim@gmail.com>
Co-authored-by: abal <github@abal.moe>
Co-authored-by: Tejas Dhamecha <90629399+notanmay@users.noreply.github.com>
Co-authored-by: Arthur Tabatchnic <arthur.tabatchnic+github@gmail.com>
Co-authored-by: TheUntraceable <73362400+TheUntraceable@users.noreply.github.com>
Co-authored-by: Maurice Doepke <mauricedoepke@outlook.de>
Co-authored-by: Keyu Ubi <65344874+Keyukemi@users.noreply.github.com>
Co-authored-by: Tom <1955774+tdelmas@users.noreply.github.com>
Co-authored-by: François de Metz <francois@2metz.fr>
Co-authored-by: Erin Dees <undees@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: duckboy81 <duckboy81@users.noreply.github.com>
Co-authored-by: Arpit Pandey <arpit.pandey05@gmail.com>
Co-authored-by: will ye <williamyeny@gmail.com>
Co-authored-by: Craig Blackburn <craig.r.blackburn@gmail.com>
Co-authored-by: aiven715 <44402489+aiven715@users.noreply.github.com>
Co-authored-by: Justin Schoen <j23schoen@gmail.com>
Co-authored-by: Mohamed Emad <73320969+Hulxv@users.noreply.github.com>
Co-authored-by: Benjamin Chodoroff <ben@falafelcopter.com>
Co-authored-by: Garrit Franke <32395585+garritfra@users.noreply.github.com>
Co-authored-by: Alpha Vylly <65187737+AlphaLawless@users.noreply.github.com>
Co-authored-by: Erin Dees <edees@briza.com>
Co-authored-by: Omar Abdelkader <omikader@gmail.com>
Co-authored-by: Warren Seymour <warren@fountainhead.tech>
Co-authored-by: André Ricardo <arbezerra@gmail.com>
Co-authored-by: Liran Tal <liran.tal@gmail.com>
Co-authored-by: Ashot Nazaryan <contact@hego.co>
Co-authored-by: Aleix Morgadas <hello@aleixmorgadas.dev>
Co-authored-by: Salvatore Garbesi <sal@dolox.com>
Co-authored-by: Kévin Berthommier <bertho-zero@users.noreply.github.com>
Co-authored-by: Deirdre Sweeney <dvsweeney9@gmail.com>
Co-authored-by: StefanAvra <stefan.avra@gmail.com>
Co-authored-by: Dominic Vonk <info@dovocode.com>
Co-authored-by: Calvin <clavin@users.noreply.github.com>
@siefimov
Copy link

This issue is still helping people (me) all this time later 🤣

In case it helps anyone else further, i had to adapt @Jordan24's example like so in typescript (also solves the casing issue):

function formatAlterTableEnumSql(tableName: string, columnName: string, enums: string[]): string {
  const constraintName = `${tableName}_${columnName}_check`;
  const checkValues = enums.map((enu) => {
    return `'${enu}'::text`;
  });
  const checkValuesString = checkValues.join(', ');
  return `
    ALTER TABLE "${tableName}" DROP CONSTRAINT IF EXISTS "${constraintName}";
    ALTER TABLE "${tableName}" ADD CONSTRAINT "${constraintName}" CHECK ("${columnName}" = ANY (ARRAY[${checkValuesString}]));
  `;
}

Yes, it works, you helped me so much!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests