3 ms·
Ask HN: How do you version control a Database?
Hello All,
I am working on a project with 2 others and we have a PostgreSQL database that links to our project. We are trying to figure out the best way to share the layout of the database as it is edited.
Currently we email each other when we change the table layout but this takes a lot of time and feels very backwards from regular Git commits.
Does anyone have any advice to version controlling a database layout? We could care less about the actual data at this point because we are still developing the system.
- rmurri 11y agoNot sure if this is helpful, but you can use a database migration framework. Check update scripts into your version control, then the others can just run them when they pull your changes. We use alembic (http://alembic.readthedocs.org/en/rel_0_7/ http://alembic.readthedocs.org/en/rel_0_7/) but something else may be a better fit for you depending on what software you use.
- lastofus 11y agoIf one of the many schema migration solutions out there doesn't work for you, hacking one together is simple enough: * Put your schema/data migrations into .sql files as raw SQL * Number the files from 0001 on * Write a script to apply each migration file to the DB in order, recording the file name to a log table after successful application. Only apply migrations not found in the log table. * Commit your .sql migration files along with the code it is tied to.
- guh_me 11y agoThat's a good approach - I've used it in a legacy system, although I named the files in the format "TIMESTAMP_migration_description", which is a bit more descriptive.
- davismwfl 11y agoSo there are solutions to this issue as others have pointed out. Full products are made around it. There are a few ways to do it quickly and more down and dirty though. 1, do what lastofus suggested, it works and is simple. 2, and the way I have used with small groups when there is limited data for testing and we are using localhost databases for dev. First, check in drop/create scripts for ever element in the database. Second, create a sql script that inserts all the test data, users etc. Third, create a shell script that you can run that gets the latest DB scripts and insert script and runs it all. It won't scale for a long time, but it works for longer than people think. Then whoever is making a new change is responsible for updating the insert script to make sure it stays 100% operational. And personally, we always tied the db script checkin to the same code set checkin that had the breaking change if there was one. Otherwise if it wasn't a breaking change which was our goal usually it could go separate. Of course, a migration framework is superior, but sometimes the weight of it just isn't what you need yet.
- SayWhatIMean 11y agoMigration frameworks superior? No way. Migration frameworks work on diffing dev with a copy of the deployment target. This is inferior. If you rename a table it may drop the table losing all data, then create a new one. It has no way of knowing a rename from 2 unrelated tables. It includes junk/testing objects that should never pollute proudction. Hope your bank is not using one of these migration frameworks. Nubmered scripts are the way to go. With a strict policy to never update a script, only create new ones. You're modifying state, so you must capture ordered steps that moved you from state 1 -> 2. This will avoid a host of subtle issues. After a release you can create a backup as a baseline for the next set of scripts to run against.
- davismwfl 11y agoMigration/comparison frameworks/tools can be used poorly just like any tool, but they don't have to be. When you have the funds and a moderately sized team, especially in dev, I think the migration tools/frameworks can be invaluable time savers and are superior. Also, the OP isn't in production, but once in Production I would expect schema changes would be less regular and generally less breaking except for occasionally. So having a tool now is more advantageous in many ways but may not fit into their budget or learning curve window, and it isn't needed, just can be nice. No tool mitigates the responsibility for reviewing the updates before applying them in production, that would just be irresponsible IMO. But then again to me, there is no such thing as a SQL database schema change that doesn't require a person monitoring deployment. I know for my teams over the years many times we have tested a script in dev and stage, only to find out in production some set of records or other change that wasn't reflected in the dev/stage environments causes an issue. That is also why we started using migration frameworks to do diffs for us between environments to help minimize the chance we would run into these issues. It also let us do comparisons of the scripts marked for deployment to make sure there weren't conflicting changes, again something that occasionally happens on larger or fast moving teams. It isn't that numbered files don't work, but just like my other suggestion, they only scale and go so far, then you really need a tool to help you keep things straight and help compare your perception to reality. For the OP, either numbered scripts or my other suggestion works for now, but I wouldn't rule out migration/comparison tools as they can really be helpful. And actually the bank point isn't really a good one, many of the financial clients I have worked for use SQL migration tools to manage their deployments, along with their DBA's playing overwatch. This allowed them to configure rules within those tools that would prevent errors from happening.
- chishaku 11y agoA simple framework for database migration that has worked for my team: https://github.com/guilhermechapiewski/simple-db-migrate https://github.com/guilhermechapiewski/simple-db-migrate
- dragonwriter 11y ago> Currently we email each other when we change the table layout but this takes a lot of time and feels very backwards from regular Git commits. Does anyone have any advice to version controlling a database layout? One method is to use pg_dump to produce the script to recreate the database, and keep that in version control with source. It may not be the best method, but its probably the one that requires the least changes to existing workflow of modifying the database and still gives something like what you want.
- monknomo 11y agoMy team is using Red Gate
- bigsexyjoe 11y agoFlyway is pretty good. It's Java-based. http://flywaydb.org/ http://flywaydb.org/
- bigsexyjoe 11y agoFlyway is a Java based migration framework. It's pretty good. It's simple and straightforward. http://flywaydb.org/ http://flywaydb.org/
- xdanger 11y agohttp://sqitch.org/ http://sqitch.org/ + git