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

AutoMigrate: Rename/Create/Drop tables #926

Open
wants to merge 18 commits into
base: master
Choose a base branch
from

Conversation

bevzzz
Copy link
Contributor

@bevzzz bevzzz commented Nov 1, 2023

This PR is my second attempt at implementing #456 :)

This time around I decided to start with the functionality we want to bring (AutoMigrator), design a good interface and work from there.

I took into account our discussions of the ALTER TABLE functionality from #726 and let each dialect export a simple RenameTable(context.Context, string, string) function to be used by AutoMigrator's internals. My thinking was that, if auto migration is done well, the users wouldn't need to work with ALTER TABLE all that much.

AutoMigrator.Migrate() is just a sketch -- running it will do the migration and record it in the db, but the users won't be able to revert it because no migration file (.sql or .go) is generated at the moment.
AutoMigrator.Run() should be used to run the migrations "in-place".

There might be other improvements to make here (e.g. add more unit test cases) but I thought I'd put it out here sooner to get the feedback.

What is still to do:

  • Resolving dependencies (e.g. rename table before creating an FK referencing it)
  • Renaming constraints when tables are renamed (FKs)
  • Handling custom user types (both UDT and those overridden with type:)
  • Add unique constraint to column type definition

Other:

  • updated test.sh to pass additional arguments to go test
    (for example, now possible to run 1 test with ./test.sh -run=TestAutoMigrator_Run)

@bevzzz
Copy link
Contributor Author

bevzzz commented Nov 1, 2023

I had to update a lot of to the existing unit tests (~5-7 files) because I noticed that many of them weren't properly cleaning up the database, causing side-effects in the auto-migrate tests.
All of those changes come in a single commit and I could open a different PR for them to be merged separately.

UPD: opened #927 for this specific change. Should make it easier to review the current one once the other changes are merged.

@bevzzz bevzzz changed the title AutoMigrate: Rename table AutoMigrate: Rename/Create/Drop tables Nov 3, 2023
HasOneRelation and BelongsToRelation aren't checked anywhere at the moment,
but the change is necessary to avoid any hidden bugs in the future.
+ Document the logic for omitting the clause for some Relations

The name References() is derived from the REFERENCES keyword
used to declare an FK constraint
Subsequent calls to WithForeignKeys() should not create additional
FOREIGN KEY clauses in the query.

DBs probably have no problem dealing with duplicated FKs, but
this behaviour is hardly expected / relied on by anyone.
Additionally:
- allow custom FK names (limited applicability rn)
- implement GetReverse for AddFK and DropFK
- detect renamed foreign keys
- EqualSignature handles empty models (no columns)
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.

None yet

1 participant