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 17 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
@bevzzz bevzzz force-pushed the feature/automigrate-rename-table branch 4 times, most recently from 8708552 to 3ef6553 Compare August 3, 2024 14:45
This is a WIP commit.
- Do not implement AppendQuery on Operation level.
This is a leaky abstraction as queries are dialect-specific
and migrate package should not be concerned with how they are constructed.
- AlterTableQuery also is an unnecessary abstraction.
Now pgdialect will just build a simple string-query for each Operation.
- Moved operations.go to migrate/ package and deleted alt/ package.
- Minor clean-ups and documentation.

testChangeColumnType is commented out because the implementation is missing.
@bevzzz bevzzz force-pushed the feature/automigrate-rename-table branch from 3ef6553 to ce75416 Compare August 3, 2024 14:46
Bufixes and improvements:
- pgdialect.Inspector canonicalizes all default expressions (lowercase)
to make sure they are always comparable with the model definition.
- sqlschema.SchemaInspector canonicalizes all default expressions (lowercase)
- pgdialect and sqlschema now support type-equivalence, which prevents unnecessary
migrations like CHAR -> CHARACTER from being created.

Changing PRIMARY KEY and UNIQUE-ness are outside of this commit's scope, because
those constraints can span multiple 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.

1 participant