{"id":13412029,"url":"https://github.com/rafaelespinoza/godfish","last_synced_at":"2026-03-12T17:39:12.755Z","repository":{"id":57508823,"uuid":"235505509","full_name":"rafaelespinoza/godfish","owner":"rafaelespinoza","description":"a db migration management CLI and library","archived":false,"fork":false,"pushed_at":"2026-01-29T02:37:33.000Z","size":385,"stargazers_count":10,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-29T07:21:57.353Z","etag":null,"topics":["cassandra","database","database-migrations","mariadb","migration","migrations","mysql","postgres","schema-migrations","sqlite3","sqlserver"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/rafaelespinoza/godfish?tab=doc","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rafaelespinoza.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-01-22T05:31:25.000Z","updated_at":"2026-01-29T02:26:17.000Z","dependencies_parsed_at":"2025-12-17T07:06:15.090Z","dependency_job_id":null,"html_url":"https://github.com/rafaelespinoza/godfish","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/rafaelespinoza/godfish","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelespinoza%2Fgodfish","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelespinoza%2Fgodfish/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelespinoza%2Fgodfish/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelespinoza%2Fgodfish/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rafaelespinoza","download_url":"https://codeload.github.com/rafaelespinoza/godfish/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelespinoza%2Fgodfish/sbom","scorecard":{"id":122008,"data":{"date":"2025-08-04","repo":{"name":"github.com/rafaelespinoza/godfish","commit":"fdb5cc92e74f5e447de7c820d9eab886e2f8ede0"},"scorecard":{"version":"v5.2.1-28-gc1d103a9","commit":"c1d103a9bb9f635ec7260bf9aa0699466fa4be0e"},"score":3.9,"checks":[{"name":"Maintained","score":1,"reason":"1 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#cii-best-practices"}},{"name":"Code-Review","score":0,"reason":"Found 0/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build-cassandra.yml:1","Warn: no topLevel permission defined: .github/workflows/build-mysql.yml:1","Warn: no topLevel permission defined: .github/workflows/build-postgres.yml:1","Warn: no topLevel permission defined: .github/workflows/build-sqlite3.yml:1","Warn: no topLevel permission defined: .github/workflows/build-sqlserver.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yaml:1","Warn: no topLevel permission defined: .github/workflows/static.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: ISC License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.11.0 not signed: https://api.github.com/repos/rafaelespinoza/godfish/releases/222588613","Warn: release artifact v0.11.0 does not have provenance: https://api.github.com/repos/rafaelespinoza/godfish/releases/222588613"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yaml:8"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#branch-protection"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#fuzzing"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#vulnerabilities"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-cassandra.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-cassandra.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-cassandra.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-cassandra.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-cassandra.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-cassandra.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-cassandra.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-cassandra.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-mysql.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-mysql.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-mysql.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-mysql.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-postgres.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-postgres.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-postgres.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-postgres.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-postgres.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-postgres.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-postgres.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-postgres.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-sqlite3.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-sqlite3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-sqlite3.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-sqlite3.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-sqlserver.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-sqlserver.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-sqlserver.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/build-sqlserver.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/release.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/static.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/static.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/static.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/static.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/static.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/static.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/static.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/rafaelespinoza/godfish/static.yml/main?enable=pin","Warn: containerImage not pinned by hash: .ci/cassandra/client.Dockerfile:1","Warn: containerImage not pinned by hash: .ci/client_base.Dockerfile:1: pin your Docker image by updating golang:alpine to golang:alpine@sha256:c8c5f95d64aa79b6547f3b626eb84b16a7ce18a139e3e9ca19a8c078b85ba80d","Warn: containerImage not pinned by hash: .ci/mysql/client.Dockerfile:1","Warn: containerImage not pinned by hash: .ci/postgres/client.Dockerfile:1","Warn: containerImage not pinned by hash: .ci/postgres/server_v14.Dockerfile:1: pin your Docker image by updating postgres:14-alpine to postgres:14-alpine@sha256:df0caf4fa0e8ce4144ae2c9649ef2386a8b88532078dd8cf5af8508cb07d5df5","Warn: containerImage not pinned by hash: .ci/postgres/server_v15.Dockerfile:1: pin your Docker image by updating postgres:15-alpine to postgres:15-alpine@sha256:1414298ea93186123a6dcf872f778ba3bd2347edcbd2f31aa7bb2d9814ff5393","Warn: containerImage not pinned by hash: .ci/sqlite3/Dockerfile:1","Warn: containerImage not pinned by hash: .ci/sqlserver/client.Dockerfile:1","Info:   0 out of  12 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   9 third-party GitHubAction dependencies pinned","Info:   0 out of   8 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#pinned-dependencies"}}]},"last_synced_at":"2025-08-16T02:39:42.803Z","repository_id":57508823,"created_at":"2025-08-16T02:39:42.803Z","updated_at":"2025-08-16T02:39:42.803Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30435475,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-12T14:34:45.044Z","status":"ssl_error","status_checked_at":"2026-03-12T14:09:33.793Z","response_time":114,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cassandra","database","database-migrations","mariadb","migration","migrations","mysql","postgres","schema-migrations","sqlite3","sqlserver"],"created_at":"2024-07-30T20:01:20.290Z","updated_at":"2026-03-12T17:39:12.745Z","avatar_url":"https://github.com/rafaelespinoza.png","language":"Go","funding_links":[],"categories":["Database","数据库","Generators","Data Integration Frameworks"],"sub_categories":["Database Schema Migration","数据库模式迁移"],"readme":"# godfish\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/rafaelespinoza/godfish.svg)](https://pkg.go.dev/github.com/rafaelespinoza/godfish)\n[![codecov](https://codecov.io/gh/rafaelespinoza/godfish/branch/main/graph/badge.svg?token=EoLelW4qiy)](https://codecov.io/gh/rafaelespinoza/godfish)\n[![Go Report Card](https://goreportcard.com/badge/github.com/rafaelespinoza/godfish)](https://goreportcard.com/report/github.com/rafaelespinoza/godfish)\n\n[![cassandra](https://github.com/rafaelespinoza/godfish/actions/workflows/build-cassandra.yml/badge.svg)](https://github.com/rafaelespinoza/godfish/actions/workflows/build-cassandra.yml)\n[![mysql](https://github.com/rafaelespinoza/godfish/actions/workflows/build-mysql.yml/badge.svg)](https://github.com/rafaelespinoza/godfish/actions/workflows/build-mysql.yml)\n[![postgres](https://github.com/rafaelespinoza/godfish/actions/workflows/build-postgres.yml/badge.svg)](https://github.com/rafaelespinoza/godfish/actions/workflows/build-postgres.yml)\n[![sqlite3](https://github.com/rafaelespinoza/godfish/actions/workflows/build-sqlite3.yml/badge.svg)](https://github.com/rafaelespinoza/godfish/actions/workflows/build-sqlite3.yml)\n[![sqlserver](https://github.com/rafaelespinoza/godfish/actions/workflows/build-sqlserver.yml/badge.svg)](https://github.com/rafaelespinoza/godfish/actions/workflows/sqlserver.yml)\n\n`godfish` is a database migration manager, similar to the very good\n[`dogfish`](https://github.com/dwb/dogfish), but written in golang.\nIt is a CLI and a library.\n\n## goals\n\n- use the native query language in the migration files, no other high-level DSLs\n- interface with many DBs\n- light on dependencies\n- not terrible error messages\n\n## releases\n\nThe Releases page of the GitHub repository has pre-built artifacts for supported platforms.\nEach archive file contains an executable binary per driver. Each executable binary will only work\nfor the targeted DB. Pick the one(s) you need.\n\nThere is also an installation script at [scripts/install.sh](./scripts/install.sh). Check it out.\n\n## build\n\nAn alternative to using a pre-built release to is to build your own.\nNOTE: these require [just](https://just.systems).\n\nMake a CLI binary for the DB you want to use. This tool comes with some driver\nimplementations. Build one like so:\n\n```\njust build-cassandra\njust build-mysql\njust build-postgres\njust build-sqlite3\njust build-sqlserver\n```\n\nFrom there you could move it to `$GOPATH/bin`, move it to your project or\nwhatever else you need to do.\n\n## concepts\n\nLike any db migration tool, this helps you and your team manage the shape of\nyour application's database throughout time. Migrations are written in the\nnative language of the database, and exist as files in a directory. All\nmigrations to consider should live in the same directory. A migration is one of\nthese files, which may have metadata components as part of the filename:\n\n* \"direction\": Migrations that introduce new changes to the DB shape are\n  considered to have a \"forward\" direction. A migration intended as the\n  inverse of a corresponding forward migration is considered to have a\n  \"reverse\" direction.\n* \"version\": Describe where a migration exists relative to the other migrations\n  with the same direction. By default, it's a timestamp in the layout\n  `YYYYMMDDHHmmss`.\n* \"name\": A label you give to describe the migration's contents.\n\nThe delimiter of each part is a `-`. Each migration filename has this format:\n```\n${direction}-${version}-${name}.sql\n```\n\nThere is an implicit ordering to migrations, denoted by the \"version\", where\nsubsequent migrations may build upon the shape created by preceding migrations.\nWhen a migration is successfully applied, a new row is inserted into the schema\nmigrations table. By default its name is `schema_migrations`. A migration\nthat has not yet been applied will be a file in the directory, but without a\ncorresponding entry in the DB table.\n\nThe shape of the schema migrations table is roughly:\n\n| column         | type    | description                                          |\n|----------------|---------|------------------------------------------------------|\n| `migration_id` | varchar | primary key timestamp, derived from filename version |\n| `label`        | varchar | describes the migration, also derived from filename  |\n| `executed_at`  | integer | unix epoch of when migration was applied             |\n\n## usage\n\nNot only is this tool a CLI, it's also a database migration library. Most of the\ntime, you'll probably want to use it as a CLI.\n\n### command line usage\n\nThis section describes basic usage of a CLI binary. For details on getting a CLI\nbinary, see the [releases](#releases) section. Golang is not required here.\n\n```\ngodfish help\ngodfish -h\ngodfish \u003ccommand\u003e -h\n```\n\nConfiguration options are read from command line flags first. If those are not\nset, then it checks the configuration file.\n\n#### connecting to the db\n\nDatabase connection parameters may be read from an environment variable. Set:\n```\nDB_DSN=\n```\nWhen using one of the pre-built binaries, the database may also be specified\nwith a command line flag, `-dsn`. If specified in both places, then the command\nline value will have higher precedence than the environment variable.\n\n#### configure file paths\n\nManually set path to db migration files.\n\n```sh\ngodfish -files db/migrations \u003ccommand\u003e\n```\n\nMake your life easier by creating a configuration file by invoking `godfish\ninit`. This creates a file at `.godfish.json`, where you can configure things.\n\nChange the path to the configuration file.\n\n```sh\nmv .godfish.json foo.json\ngodfish -conf foo.json\n```\n\n#### everything else\n\n```sh\ncat .godfish.json\n# { \"path_to_files\": \"db/migrations\" }\n\ngodfish create-migration -name alpha\n# outputs:\n# db/migrations/forward-20200128070010-alpha.sql\n# db/migrations/reverse-20200128070010-alpha.sql\n\ngodfish create-migration -name bravo -reversible=false\n# outputs:\n# db/migrations/forward-20200128070106-bravo.sql\n\n#\n# ... write the sql in those files ...\n#\n\n# apply migrations\ngodfish migrate\n# apply migrations to up a specific version\ngodfish migrate -version 20060102150405\n\n# show status\ngodfish info\n\n# apply a reverse migration\ngodfish rollback\n\n# rollback and re-apply the last migration\ngodfish remigrate\n\n# show build metadata\ngodfish version\ngodfish version -json\n```\n\n### library usage\n\nThough most of the time you'll probably want to use one of the pre-built\nbinaries, you could also use this as a golang library.\n\n```\ngo get github.com/rafaelespinoza/godfish\n```\n\n#### embed migrations\n\nAn issue that may arise with deployments is that the migration files must be\ndeployed alongside the godfish binary. Migrations data and the behavior provided\nby the `godfish` library can be combined into a single self-contained binary by\nusing the [`embed`](https://pkg.go.dev/embed) package.\nSee the [go doc](https://pkg.go.dev/github.com/rafaelespinoza/godfish?tab=doc)\npage for an example.\n\n### upgrading schema migrations\n\nIf you have data created with `v0.14.0` or lower and then later on use a newer\nversion, then you may run into an error message like:\n```\nschema migrations table is missing columns; run the upgrade command to fix this\n```\n\nA schema migrations table created with versions \u003c= `v0.14.0` will lack the\n`label` and `executed_at` columns. The `upgrade` command adds them.\n\n## other minutiae\n\nHere are some notable differences between `dogfish` and `godfish`:\n\nFilenames:\n\n- dogfish: `migrate-${date}-${name}.sql`, or `rollback-${date}-${name}.sql`\n- godfish: `forward-${date}-${name}.sql`, or `reverse-${date}-${name}.sql`\n\nNote, dogfish uses the words, \"migrate\" and \"rollback\" to describe the\nmigration's direction whereas godfish uses \"forward\" and \"reverse\". They are\nthe same in that they are two complementaries.\n\n```sh\nls -1 /path/to/db/migrations\n\nforward-20191112050547-init_foos.sql\nforward-20221067051242-add_bars.sql\nforward-20250805031405-update_more_stuff.sql\nreverse-20191112050547-init_foos.sql\nreverse-20221067051242-add_bars.sql\nreverse-20250805031405-update_more_stuff.sql\n```\n\n## project organization\n\nOne of the goals of this project is to minimize the amount of dependencies.\nDriver-specific code is placed in `drivers/` so that building a binary for one\ndatabase does not require building code for another database.\n\nThe `godfish` package defines library functions, interfaces needed to build a\ndriver implementation.\n\nTest infrastructure mostly lives in the `.ci/` and `.github/` directories. Many\nintegration tests may be run in isolation on your local machine without GitHub\nactions.\n\n## tests\n\nDocker (or equivalent) is used to create environments and run the tests against\na live database. Each database has a separate configuration. All of this lives\nin `ci.Justfile` and the `.ci/` directory.\n\nUsing an OCI-compatible tool other than `docker` (ie: `podman`)?\n```sh\njust --set CONTAINER_TOOL podman -f ci.Justfile\n```\n\nBuild environments and run tests\n```sh\njust -f ci.Justfile cassandra3-up\njust -f ci.Justfile cassandra4-up\n\njust -f ci.Justfile sqlserver-up\n\njust -f ci.Justfile mariadb-up\n\njust -f ci.Justfile postgres14-up\njust -f ci.Justfile postgres15-up\n\njust -f ci.Justfile sqlite3-up\n```\n\nTeardown\n```sh\njust -f ci.Justfile cassandra3-down\njust -f ci.Justfile cassandra4-down\n\njust -f ci.Justfile sqlserver-down\n\njust -f ci.Justfile mariadb-down\n\njust -f ci.Justfile postgres14-down\njust -f ci.Justfile postgres15-down\n\njust -f ci.Justfile sqlite3-down\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelespinoza%2Fgodfish","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frafaelespinoza%2Fgodfish","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelespinoza%2Fgodfish/lists"}