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

Fix migrations #1252

Merged
merged 14 commits into from
Apr 27, 2021
Merged

Fix migrations #1252

merged 14 commits into from
Apr 27, 2021

Conversation

parsonsmatt
Copy link
Collaborator

@parsonsmatt parsonsmatt commented Apr 26, 2021

Before submitting your PR, check that you've:

  • Documented new APIs with Haddock markup
  • Added @since declarations to the Haddock
  • Ran stylish-haskell on any changed files.
  • Adhered to the code style (see the .editorconfig file for details)

After submitting your PR:

  • Update the Changelog.md file with a link to your PR
  • Bumped the version number if there isn't an (unreleased) on the Changelog
  • Check that CI passes (or if it fails, for reasons unrelated to your change, like CI timeouts)

Migrations now do not do anything fancy. They call mkEntityDefList and then do an entirely ordinary traverse_ (filter shouldmIgrate defs) (migrate defs)

@parsonsmatt parsonsmatt changed the base branch from master to persistent-2.13 April 26, 2021 20:14
Copy link
Collaborator Author

@parsonsmatt parsonsmatt left a comment

Choose a reason for hiding this comment

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

lorde help i Despise laziness right now

entityDefExp <-
if mpsGeneric mps
then liftAndFixKeys entityMap entDef
else makePersistEntityDefExp mps entityMap entDef
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I had to remove this optimization, since it wasn't handling FieldDef for MigrationOnly stuff.

tpf <- mkToPersistFields mps entDef
fpv <- mkFromPersistValues mps entDef
utv <- mkUniqueToValues $ entityUniques entDef
puk <- mkUniqueKeys entDef
let primaryField = entityId entDef
fields <- mapM (mkField mps entDef) $ primaryField : getEntityFields entDef
fields <- mapM (mkField mps entDef) $ primaryField : getEntityFieldsDatabase entDef
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Since migrations are now handled by mkEntityDefList, we need to preserve all the field information.

edList <- mkEntityDefList entityDefListName eds
pure $ edList <>
[ SigD (mkName fun) (ConT ''Migration)
, FunD (mkName fun) [normalClause [] body]
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This is the main change, as far as users are concerend

Instead of fixing the keys and faffing about with all that, we just use the result of mkEntityDefList, which contains the canonical EntityDef defined in PersistEntity.

{ embeddedHaskell = entityHaskell ent
, embeddedFields =
map toEmbedFieldDef
$ filter isHaskellField
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

If we're embedding the entity, then we only care about the Haskell variants. We can't have a normal SQL schema, so it's inherently flexible/untyped.

@@ -500,7 +500,7 @@ findTypeOfColumn allDefs name col =
((,) col)
$ do
entDef <- find ((== name) . getEntityDBName) allDefs
fieldDef <- find ((== col) . fieldDB) (getEntityFields entDef)
fieldDef <- find ((== col) . fieldDB) (getEntityFieldsDatabase entDef)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Lots of this is in the backend modules. We need all the columns, not just the Haskell fields.

@@ -475,7 +491,7 @@ mkPersist mps ents' = do
, symbolToFieldInstances
]
where
ents = map (fixEntityDef . setDefaultIdFields mps) ents'
ents = embedEntityDefs $ map (setDefaultIdFields mps) ents'
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This fixes the embed definitions.

@parsonsmatt parsonsmatt merged commit 33a8676 into persistent-2.13 Apr 27, 2021
parsonsmatt added a commit that referenced this pull request May 5, 2021
* Internalize SqlBackend (#1225)

* abstractification

* abstractification

* Internalize SqlBackend

* suppor tother sql dbs

* bounds

* asdf

* import data.monoid

* limitoffset and backendspecificoverrides

* use setter

* getConnUpsertSql

* formatting

* sigh

* clean warns

* cabal formatting

* merge resolve

* lol

* ok

* update changelogs

* one more [ci skip]

* Implicit ID Column Configuration (#1234)

* Implicit ID Column COnfiguration

* PersistSettings is internal

* start teasing out the module structure

* move around, factor out the Names module

* start enumerating types, make entitydef abstract

* entity def abstraction

* teasing out the EntityDef stuff

* builds

* testinggg

* it works

* it works

* tidy up

* sigh

* i hate you

* tidy

* wrote test for mysql, need to set maxlen sigh

* mysql test, need to be able to set maxlen

* support mysql lmfao

* whyyy

* Deprecate mpsGeneric (#1250)

* discoverEntities (#1253)

* discover entities

* remove fdescribe

* changelog

* yupo

* remove error

* Fix migrations (#1252)

* Better migrations

* why is the test failing

* Columns are present in entityFields now, but the generated code is broken.

* th specs work

* fixed mkColumns

* changelog entry

* fix mongo

* no idea why this is broken now

* why on earth did this work

* remove debug trace statements

* typo

* what no put that back in

* Check for existence of entities before generating them (#1255)

* wtf

* hmmm

* refactor and tidy

* are foreign fields never right ?!

* changelog

* fix comments

* dead code

* Implement config for customising the FK name (#1244)

* Implement config for customising the FK name

* Update changelog

* Tweak test description

* Tweaks/better use of types

* Review tweaks

* Some initial post-review changes

* Table name turned out to be EntityNameHS

* Do the same thing but for the constraint

* Expose more stuff

* Some refactoring / cleanup

* Fix changelog indentation

* Tidy code layout

* QuasiQuoter Improvements (#1256)

* QQ now returns UnboundEntityDef

* Relocate fixForeignKeysAll

* deprecate some stuff, reorganize some code

* ok, now we need to set sql types appropriately.

* dodgy instances are banned

* fuse away the EntityDefSqlTypeExp stuff

* refactor to top level

* fuse sqlTypeExp in there

* fix Key vs Id stuff

* still need to get the foreign key types right

* hmmm

* move to QuasiSpec

* clean up tests

* so close

* ok but what if i don't fix foreign keys

* wip

* oh man please

* getting closer...

* make some tests

* fix json and keyFromValueM

* slightly more graceful handling

* return dummy field for id, from persist values

* got some tests passing

* well sqlite works

* pg tests running

* what happened

* hmm mongo is trashed maybe

* bye mongo

* ok for real bye mongo, for now at least

* clean warns

* asdf

* drop GHC 8.2 support

* sigh

* lots of commments

* Merge branch 'master' into persistent-2.13 (#1261)

* Reexport PersistValue

* fix json for MigrationOnly

* Export onlyOneUniqueDef (fixes #1194)

* use onlyOneUniqueDef in persistent-postgresql

Co-authored-by: Dan Brooks <danbroooks@users.noreply.github.com>
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