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

feat: Add referenced table metadata to namingstrategy to resolve foreignKeyName #4274

Merged
merged 1 commit into from
Sep 13, 2019
Merged

Conversation

tkvw
Copy link
Contributor

@tkvw tkvw commented Jun 11, 2019

@@ -60,7 +60,7 @@ export interface NamingStrategyInterface {
/**
* Gets the name of the foreign key.
*/
foreignKeyName(tableOrName: Table|string, columnNames: string[]): string;
foreignKeyName(tableOrName: Table|string, columnNames: string[], referencedTablePath: string, referencedColumnNames: string[]): string;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we need to mark them with ? to prevent breaking release

@pleerock
Copy link
Member

Also would be great to have a test for this use case :) Also please add a PR title according to our standards. Thanks :)

@tkvw tkvw changed the title Add referenced table metadata to namingstrategy to resolve foreignKeyName feat: Add referenced table metadata to namingstrategy to resolve foreignKeyName Jul 16, 2019
…ign key name

Feature allows to use foreignkey metadata to generate database foreignkey names.

Closes #3847 and #1355
@tkvw
Copy link
Contributor Author

tkvw commented Jul 16, 2019

@pleerock:
Fixed conversation, rebased commit and added test

@0radek
Copy link
Contributor

0radek commented Aug 3, 2019

Will this give the ability in the future to give our own custom constraint names, or will it just be generated by the scheme in the code?

@tkvw
Copy link
Contributor Author

tkvw commented Aug 7, 2019

Will this give the ability in the future to give our own custom constraint names, or will it just be generated by the scheme in the code?

No, that is already possible using the namingstrategy. This PR just add some additional arguments to generate a foreignkey name based on referenced columns. This is not possible at te moment.

@pleerock pleerock merged commit 0094f61 into typeorm:master Sep 13, 2019
@pleerock
Copy link
Member

merged, sorry for late response here

haggholm added a commit to haggholm/typeorm that referenced this pull request Sep 15, 2019
commit 7623e890609610c1ea8cc6f98f70556267d8a8c6
Merge: 038c2edd 13ac222
Author: Petter Häggholm <petter@petterhaggholm.net>
Date:   Sat Sep 14 17:54:03 2019 -0700

    bugfix

commit 038c2edd31def7860e46e8f3c92cfc88d7e66c61
Author: Petter Häggholm <petter@petterhaggholm.net>
Date:   Sat Sep 14 14:22:35 2019 -0700

    fix locking

commit 13ac222
Author: Umed Khudoiberdiev <pleerock.me@gmail.com>
Date:   Fri Sep 13 23:20:36 2019 +0500

    updated changelog

commit ae1f131
Author: Umed Khudoiberdiev <pleerock.me@gmail.com>
Date:   Fri Sep 13 21:22:40 2019 +0500

    version bump

commit d8f1c81
Author: Roman <52884896+roman-acumen@users.noreply.github.com>
Date:   Fri Sep 13 18:12:23 2019 +0300

    fix: sqlite connections don't ignore the schema property (typeorm#4599)

commit 0094f61
Author: Dennie de Lange <dennie@tkvw.nl>
Date:   Fri Sep 13 16:58:20 2019 +0200

    feat: add referenced table metadata to NamingStrategy to resolve foreign key name (typeorm#4274)

    Feature allows to use foreignkey metadata to generate database foreignkey names.

    Closes typeorm#3847 and typeorm#1355

commit 3abe5b9
Author: Toby Hinloopen <toby@bonaroo.nl>
Date:   Fri Sep 13 16:04:12 2019 +0200

    fix: "hstore injection" & properly handle NULL, empty string, backslashes & quotes in hstore key/value pairs (typeorm#4720)

    * Improve HStore object support

    * Add hstore-injection test

commit 644c21b
Author: Muma David Bwalya <davidtheprogrammer42@gmail.com>
Date:   Fri Sep 13 12:32:22 2019 +0200

    docs: explicitly defining the optional nature of the ManyToOne and OneToMany relationship when viewed from the child entity (typeorm#4722)

    * Update many-to-one-one-to-many-relations.md

    Explicitly defining the optional nature of the ManyToOne and OneToMany relationship when viewed from the child entity.

    * Update docs/many-to-one-one-to-many-relations.md

    Punctuation and more accurate semantics.

    Co-Authored-By: Toby Hinloopen <toby@bonaroo.nl>

commit c52b3d2
Author: Evgeniy <evgesh1918@gmail.com>
Date:   Fri Sep 13 13:04:11 2019 +0300

    fix: views generating broken Migrations (typeorm#4726)

    MigrationGenerateCommand didn't apply parameters to query and information about ViewTables couldn't be inserted into typeorm_metadata table. Also added code that creates typeorm_metadata table if ViewTables exists

    Fixed issue typeorm#4123

commit 1d73a90
Author: Ian Mobley <ianmobley@gmail.com>
Date:   Fri Sep 13 00:22:17 2019 -0700

    fix: createQueryBuilder relation remove works only if using ID (typeorm#2632) (typeorm#4734)

commit 81f4b43
Author: Alex Howard <thezanke@gmail.com>
Date:   Fri Sep 13 03:16:07 2019 -0400

    docs: added missing comma in relations.md (typeorm#4739)

commit 7808bba
Author: Junggun Lim <junggun.lim@gmail.com>
Date:   Thu Sep 5 12:44:25 2019 -0700

    feat: UpdateResult returns affected rows in postgresql (typeorm#4432)

    * Added 'affected' field in UpdateResult as well as in DeleteResult.
     * PostgresQueryRunner returns the number of affected rows properly
     * UpdateQueryBuilder retrieves the affected rows returned by PostgresQueryRunner and
       sets the added 'affected' field of UpdateResult properly.

    Closes: typeorm#1308

commit 7a0beed
Author: Mophy Xiong <mophy.xh@gmail.com>
Date:   Fri Sep 6 03:33:39 2019 +0800

    fix: the excessive stack depth comparing types `FindConditions<?>` and `FindConditions<?>` problem (typeorm#4470)

commit dacac83
Author: Michał Wadas <michalwadas@gmail.com>
Date:   Thu Sep 5 21:28:56 2019 +0200

    feat: add materialized View support for Postgres (typeorm#4478)

    feat: add option to synchronize or not to synchronize ViewEntity

    Fixes typeorm#4317
    Fixes  typeorm#3996

commit db8074a
Author: Nicolas Hervé <nicolas.herve.pessac@gmail.com>
Date:   Thu Sep 5 19:42:52 2019 +0200

    feat: add support for ON CONFLICT for cockroach (typeorm#4518)

    Closes: typeorm#4513

commit 19e2179
Author: hauau <hauau@users.noreply.github.com>
Date:   Fri Sep 6 00:38:54 2019 +0700

    feat: add `set` datatype support for MySQL/MariaDB (typeorm#4538)

    Set possible values defined using existing enum column option.
    Sets are implemented as arrays.

    Closes: typeorm#2779

commit 5c311ed
Author: David Chen <42685381+DavidChen-minted@users.noreply.github.com>
Date:   Thu Sep 5 08:50:10 2019 -0700

    feat: add options to input init config for sql.js (typeorm#4560)

    * add options to input init config for sql.js

    * update changelog

    * updated connection-options docs

commit 3cf470d
Author: Aviad Hadad <aviadhadad@gmail.com>
Date:   Thu Sep 5 18:46:19 2019 +0300

    fix: change PrimaryColumn decorator to clone passed options (typeorm#4571)

    Closes: typeorm#4570

commit 9e3d664
Author: Mike Guida <mike@mguida.com>
Date:   Thu Sep 5 08:38:41 2019 -0700

    docs: clarify title of configuration sources (typeorm#4592)

commit 587d534
Author: Thomas Gieling <thomas.gieling@gmail.com>
Date:   Thu Sep 5 17:37:43 2019 +0200

    use remove in stead of delete (typeorm#4574)

    the `remove` method requires the entity itself as input. To remove a record based on it's id, you need to use `delete`

commit a925be9
Author: Michał Wadas <michalwadas@gmail.com>
Date:   Thu Sep 5 16:05:23 2019 +0200

    feat: add postgres pool error handler (typeorm#4474)

    Add option to customize pool error handling. Users can decide to log these errors with higher level (eg. error), crash application or reconnect.

commit f65ecc7
Author: JB Reefer <james.reefer@gmail.com>
Date:   Thu Sep 5 09:10:10 2019 -0400

    docs: grammar and wording fixes in active-record-data-mapper.md (typeorm#4615)

    Grammar and wording fixes in bottom paragraph

commit 445c740
Author: Duckie <7842848+duckies@users.noreply.github.com>
Date:   Thu Sep 5 08:59:50 2019 -0400

    fix: apostrophe in Postgres enum strings breaks query (typeorm#4631)

    * Patch to allow apostrophes in postgres enum string.

    * Make linter happy

    * Testing fix for MySQL

    * Limit to postgres and mysql, fix test description

    * Lets not be greedy.

commit c1406bb
Author: kevindashgit <friedheim.kevin@gmail.com>
Date:   Thu Sep 5 05:30:24 2019 -0700

    docs: documentation for showMigrations() (typeorm#4644)

commit 2478198
Author: azxj <31400828+azxj@users.noreply.github.com>
Date:   Thu Sep 5 20:29:23 2019 +0800

    docs: remove duplicate segment in entities.md (typeorm#4638)

    Remove duplicate segment.

commit 5bd29d5
Author: QoVoQ <674263588@qq.com>
Date:   Thu Sep 5 20:27:30 2019 +0800

    docs: update many-to-many-relations.md, make it easier to understand (typeorm#4680)

    * Update many-to-many-relations.md

    Make the example of the last section `many-to-many relations with custom properties` more clear and general.

    * Update many-to-many-relations.md

commit 92e4270
Author: Coroliov Oleg <1880059+ruscon@users.noreply.github.com>
Date:   Thu Sep 5 15:25:06 2019 +0300

    feat: add mongodb `useUnifiedTopology` config parameter (typeorm#4684)

commit 690e6f5
Author: CavidM <cavid2409@gmail.com>
Date:   Thu Sep 5 05:18:03 2019 -0700

    fix: "database" option error in driver when use "url" option for connection

commit e589fda
Author: Michael Dzjaparidze <michael.dzjaparidze@gmail.com>
Date:   Tue Sep 3 15:05:58 2019 +0200

    feat: export additional schema builder classes (typeorm#4325)

commit 3951b58
Author: David Podhola <david.podhola@naseukoly.cz>
Date:   Sat Aug 31 23:39:04 2019 +0200

    docs: fix missing async (typeorm#4458)

    In the second example the lambda is correctly started with an `async`. It is missing in the first example.

commit d4e2443
Author: Kateile <sylvanuskateile@gmail.com>
Date:   Sat Aug 31 21:26:44 2019 +0300

    docs: update typeorm-model-shim.js comment link (typeorm#4540)

    This link http://webpack.github.io/docs/configuration.html#resolve no longer exist

commit 4c2bffc
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Fri Aug 30 23:43:04 2019 +0200

    chore: bump lodash from 4.17.11 to 4.17.15 (typeorm#4671)

    Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.15.
    - [Release notes](https://github.com/lodash/lodash/releases)
    - [Commits](lodash/lodash@4.17.11...4.17.15)

    Signed-off-by: dependabot[bot] <support@github.com>

commit 10bac1f
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Fri Aug 30 23:35:40 2019 +0200

    build: bump mixin-deep from 1.3.1 to 1.3.2 (typeorm#4648)

    Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.1 to 1.3.2.
    - [Release notes](https://github.com/jonschlinkert/mixin-deep/releases)
    - [Commits](jonschlinkert/mixin-deep@1.3.1...1.3.2)

    Signed-off-by: dependabot[bot] <support@github.com>

commit e81a77a
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Fri Aug 30 23:33:36 2019 +0200

    chore: bump lodash.template from 4.4.0 to 4.5.0 (typeorm#4416)

    Bumps [lodash.template](https://github.com/lodash/lodash) from 4.4.0 to 4.5.0.
    - [Release notes](https://github.com/lodash/lodash/releases)
    - [Commits](lodash/lodash@4.4.0...4.5.0)

    Signed-off-by: dependabot[bot] <support@github.com>

commit 00d46e1
Author: JB Reefer <james.reefer@gmail.com>
Date:   Sat Aug 24 05:08:26 2019 -0400

    docs: Update using-cli.md (typeorm#4618)

    Fix typo

commit d1594f5
Author: Abhijeet Chakraborty <16278759+abhijeet1403@users.noreply.github.com>
Date:   Wed Aug 14 14:01:48 2019 +0530

    fix: resolve issue with conversion string to simple-json (typeorm#4476)

    Closes: typeorm#4440

commit c321562
Author: Arseny Yankovsky <ArsenyYankovsky@users.noreply.github.com>
Date:   Tue Aug 13 10:12:25 2019 +0200

    feat: Aurora Data API (typeorm#4375)

    * Initial POC Implementation

    * Initial POC Implementation

    * Implemented an interface transformation between typeorm and data api so most of the queries should work, added some tests

    * Fixed lint errors

    * Fixed a regex and added some tests on query transformation

    * Move out to a separate repo

    * Bumped aurora driver version to latest

    * Bumped aurora driver version to latest

    * Delegate transactions to the driver

    * Delegate transactions to the driver

    * WIP

    * WIP

    * Bump the aurora driver version

    * Bump the aurora driver version

    * Fixed aurora driver version

    * removed unused entity

commit b4e9cf0
Author: Marcos <holamarcosaurios@gmail.com>
Date:   Wed Aug 7 11:35:11 2019 +0200

    docs: update typo in separating-entity-definition.md

    Typo in line 190: "Categeory" changed to "Category"

commit 9930283
Author: Charlie Cruzan <35579283+cruzach@users.noreply.github.com>
Date:   Wed Aug 7 05:33:42 2019 -0400

    docs: update outdated Expo SQLite link

    * update Expo SQLite link

    * docs: fix expo-example repo link

commit 5e00e81
Author: Humberto Villalpando <43765965+betov18x@users.noreply.github.com>
Date:   Wed Jul 31 06:47:36 2019 -0500

    chore: Update README.md

    Added some links for nativescript examples with vue and angular

commit 10a5182
Author: markamPL <markam.tg@gmail.com>
Date:   Wed Jul 24 09:00:47 2019 +0200

    docs: update typo in using-ormconfig.md

    Typo in .env configuration: .*js changed to *.js

commit b6d6278
Author: Liau Jian Jie <liaujianjie@gmail.com>
Date:   Sun Jul 21 22:10:53 2019 +0800

    feat: add multi-dimensional cube support for PostgreSQL (typeorm#4378)

commit e12479e
Author: Abdoulaye K. Traoré <abdoulayekt@hotmail.com>
Date:   Sat Jul 13 18:57:16 2019 +0200

    feat: log files loaded from glob patterns (typeorm#4346)

    This new feature logs the files that are loaded using the glob patterns to aid in debugging.

    Closes: typeorm#4162

commit c8dbf09
Author: Mike Harris <mharris717@gmail.com>
Date:   Wed Jul 10 09:17:31 2019 -0400

    docs: Fix Typo (typeorm#4412)

commit a858de1
Author: Vlad Poluch <vlad.poluch@gmail.com>
Date:   Mon Jul 1 16:01:09 2019 +0200

    Revert "docs: fix typographical error in faq (typeorm#4321)" (typeorm#4380)

    This reverts commit 117185b.

commit 39a8e34
Author: Benjamin Dobell <benjamin.dobell+github@glassechidna.com.au>
Date:   Mon Jul 1 01:18:55 2019 +1000

    feat: Added support for DISTINCT queries (typeorm#4109)

commit c8a9ea0
Author: Max Sommer <kontakt@maxsommer.de>
Date:   Sun Jun 30 17:12:07 2019 +0200

    docs: add explanation ManyToMany with custom properties (typeorm#4308)

    * Add explanation ManyToMany with custom properties

    Since I myself ran into the issue and had to rewrite my code based on this solution I hope it may be helpful for others as well 😊

    * Update explanation with more relateable example

    Update explanation with abstract example to be more relateable
    Add cross link to faq

    * Update phrasing, unnecessary explanation and code

    Remove unnecessary explanation upfront mentioning FAQ
    Update phrasing of main explanatory paragraph to be more precise
    Update code example to work correctly

commit 79bf9f7
Author: Kononnable <kononnable@gmail.com>
Date:   Sun Jun 30 17:11:06 2019 +0200

    build: node version upgrade in travis (typeorm#4312)

    * upgrading node CI tested versions

    * sqlite3 version upgrade

commit a6d7ba2
Author: Leonardo Falk <leonardofalk@users.noreply.github.com>
Date:   Sun Jun 30 12:07:19 2019 -0300

    fix: add SaveOptions and RemoveOptions into ActiveRecord (typeorm#4318)

    * Adding SaveOptions to BaseEntity#save

    * Adding RemoveOptions to BaseEntity#remove

commit 684ffd1
Merge: 6429ccd 6a1206e
Author: Umed Khudoiberdiev <pleerock.me@gmail.com>
Date:   Sun Jun 30 14:39:21 2019 +0300

    Merge pull request typeorm#4376 from typeorm/revert-4306-fix-4291

    Revert "fix: improve sql.js v1.0 support in browser environment"

commit 6a1206e
Author: Umed Khudoiberdiev <pleerock.me@gmail.com>
Date:   Sun Jun 30 14:38:54 2019 +0300

    Revert "fix: improve sql.js v1.0 support in browser environment"

commit 6429ccd
Merge: 117185b ed87e34
Author: Umed Khudoiberdiev <pleerock.me@gmail.com>
Date:   Sun Jun 30 14:00:46 2019 +0300

    Merge pull request typeorm#4306 from michaelbromley/fix-4291

    fix: improve sql.js v1.0 support in browser environment

commit 117185b
Author: SriNath <12288245+SrChip15@users.noreply.github.com>
Date:   Wed Jun 19 09:13:47 2019 -0400

    docs: fix typographical error in faq (typeorm#4321)

    change "typedi" to "typed" in how to use TypeORM with a dependency injection tool question

commit ed87e34
Author: Michael Bromley <michael@michaelbromley.co.uk>
Date:   Tue Jun 18 10:25:35 2019 +0200

    Add more documentation on using sql.js in the browser

commit f7bcd8f
Author: Michael Bromley <michael@michaelbromley.co.uk>
Date:   Tue Jun 18 10:05:04 2019 +0200

    Fix sql.js v1.0 support in browser
@tdnghia98
Copy link

namingstrategy

Is there any support for this? It could be really useful when debugging, having generic constraints name is confusing

@FernandoRicardez
Copy link

So it is posible to change the FK_0669fe20e252eb692bf4d344975, To something custom or at least more readable if it is some documentation would be neat!

@kaykhancheckpoint
Copy link

For those struggling with this, it is possible to explicitly set the name of FK constraints by building a naming strategy.

CustomNamingStrategy

The following naming convention is used below: <table1>_<table2>_<table1_column> then i hash this because it could get long and mysql will throw an identifier too long error.

This method makes the foreign keys deterministic so that i can use the same migrations for both test and production db.

import { DefaultNamingStrategy, Table, NamingStrategyInterface } from "typeorm";
import crypto from "crypto";

export class CustomNamingStrategy extends DefaultNamingStrategy implements NamingStrategyInterface {
    foreignKeyName(tableOrName: Table | string, columnNames: string[], referencedTablePath?: string, referencedColumnNames?: string[]): string {
        
        tableOrName =
            typeof tableOrName === "string" ? tableOrName : tableOrName.name;

        const name = columnNames.reduce(
            (name, column) => `${name}_${column}`,
            `${tableOrName}_${referencedTablePath}`,
        );

        return`fk_${crypto.createHash('md5').update(name).digest("hex")}`
    }
}

ormconfig.ts

Then import the custom naming strategy in your config.

module.exports = {
    "type": "mysql",
    "host": process.env.DB_HOST,
    ...
    namingStrategy: new CustomNamingStrategy()
}

references:

https://github.com/typeorm/typeorm/tree/master/sample/sample12-custom-naming-strategy
#5286
https://github.com/typeorm/typeorm/pull/4274/files

@emtiajium
Copy link

For those struggling with this, it is possible to explicitly set the name of FK constraints by building a naming strategy.

CustomNamingStrategy

The following naming convention is used below: <table1>_<table2>_<table1_column> then i hash this because it could get long and mysql will throw an identifier too long error.

This method makes the foreign keys deterministic so that i can use the same migrations for both test and production db.

import { DefaultNamingStrategy, Table, NamingStrategyInterface } from "typeorm";
import crypto from "crypto";

export class CustomNamingStrategy extends DefaultNamingStrategy implements NamingStrategyInterface {
    foreignKeyName(tableOrName: Table | string, columnNames: string[], referencedTablePath?: string, referencedColumnNames?: string[]): string {
        
        tableOrName =
            typeof tableOrName === "string" ? tableOrName : tableOrName.name;

        const name = columnNames.reduce(
            (name, column) => `${name}_${column}`,
            `${tableOrName}_${referencedTablePath}`,
        );

        return`fk_${crypto.createHash('md5').update(name).digest("hex")}`
    }
}

ormconfig.ts

Then import the custom naming strategy in your config.

module.exports = {
    "type": "mysql",
    "host": process.env.DB_HOST,
    ...
    namingStrategy: new CustomNamingStrategy()
}

references:

https://github.com/typeorm/typeorm/tree/master/sample/sample12-custom-naming-strategy #5286 https://github.com/typeorm/typeorm/pull/4274/files

Which TypeORM version are you using? I use v0.2.32, and it simply ignores my custom naming strategy.

My codes
https://github.com/emtiajium/ielts-gibberish/blob/b5717f4a52b9f24ead1e11fc9220f1c3e127b4c0/src/common/persistence/DatabaseModule.ts#L46

https://github.com/emtiajium/ielts-gibberish/blob/0e8703b52dc8dd8fd7a4c17bd0eb7f63b49c838e/src/common/persistence/DatabaseNamingStrategy.ts#L16

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

Successfully merging this pull request may close these issues.

7 participants