{"id":13483762,"url":"https://github.com/djezzzl/database_consistency","last_synced_at":"2026-10-19T15:13:06.220Z","repository":{"id":37484193,"uuid":"155371995","full_name":"djezzzl/database_consistency","owner":"djezzzl","description":"The tool to avoid various issues due to inconsistencies and inefficiencies between a database schema and application models.","archived":false,"fork":false,"pushed_at":"2026-10-14T07:24:42.000Z","size":1074,"stargazers_count":1195,"open_issues_count":3,"forks_count":67,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-10-18T01:09:51.269Z","etag":null,"topics":["activerecord","consistency","database","optimization","performance","rails","ruby","ruby-on-rails","tool"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/djezzzl.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"open_collective":"database_consistency","github":"djezzzl"}},"created_at":"2018-10-30T11:13:51.000Z","updated_at":"2026-10-14T07:24:44.000Z","dependencies_parsed_at":"2026-07-28T14:00:22.104Z","dependency_job_id":null,"html_url":"https://github.com/djezzzl/database_consistency","commit_stats":{"total_commits":298,"total_committers":29,"mean_commits":"10.275862068965518","dds":"0.17449664429530198","last_synced_commit":"393db823d166fb704876c6365e84dff3e8519248"},"previous_names":[],"tags_count":131,"template":false,"template_full_name":null,"purl":"pkg:github/djezzzl/database_consistency","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djezzzl%2Fdatabase_consistency","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djezzzl%2Fdatabase_consistency/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djezzzl%2Fdatabase_consistency/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djezzzl%2Fdatabase_consistency/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/djezzzl","download_url":"https://codeload.github.com/djezzzl/database_consistency/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djezzzl%2Fdatabase_consistency/sbom","scorecard":{"id":346075,"data":{"date":"2025-08-11","repo":{"name":"github.com/djezzzl/database_consistency","commit":"d94c9185a1a8caf61c438ae7ea65f65643f49f66"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":2,"reason":"Found 6/22 approved changesets -- score normalized to 2","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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/integrations.yml:1","Warn: no topLevel permission defined: .github/workflows/rubocop.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"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/integrations.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/djezzzl/database_consistency/integrations.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/integrations.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/djezzzl/database_consistency/integrations.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rubocop.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/djezzzl/database_consistency/rubocop.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rubocop.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/djezzzl/database_consistency/rubocop.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/djezzzl/database_consistency/tests.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/djezzzl/database_consistency/tests.yml/master?enable=pin","Warn: containerImage not pinned by hash: rails8-example/Dockerfile:12","Warn: containerImage not pinned by hash: rails8-example/Dockerfile:29","Warn: containerImage not pinned by hash: rails8-example/Dockerfile:55","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned","Info:   0 out of   3 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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 19 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T07:04:25.239Z","repository_id":37484193,"created_at":"2025-08-18T07:04:25.240Z","updated_at":"2025-08-18T07:04:25.240Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":344872684,"owners_count":38336443,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-18T02:00:06.448Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["activerecord","consistency","database","optimization","performance","rails","ruby","ruby-on-rails","tool"],"created_at":"2024-07-31T17:01:15.038Z","updated_at":"2026-10-19T15:13:06.213Z","avatar_url":"https://github.com/djezzzl.png","language":"Ruby","funding_links":["https://opencollective.com/database_consistency","https://github.com/sponsors/djezzzl","https://opencollective.com/database_consistency/backer/0/website","https://opencollective.com/database_consistency/backer/1/website","https://opencollective.com/database_consistency/backer/2/website","https://opencollective.com/database_consistency/backer/3/website","https://opencollective.com/database_consistency/backer/4/website","https://opencollective.com/database_consistency/backer/5/website","https://opencollective.com/database_consistency/backer/6/website","https://opencollective.com/database_consistency/backer/7/website","https://opencollective.com/database_consistency/backer/8/website","https://opencollective.com/database_consistency/backer/9/website","https://opencollective.com/database_consistency/backer/10/website","https://opencollective.com/database_consistency/backer/11/website","https://opencollective.com/database_consistency/backer/12/website","https://opencollective.com/database_consistency/backer/13/website","https://opencollective.com/database_consistency/backer/14/website","https://opencollective.com/database_consistency/backer/15/website","https://opencollective.com/database_consistency/backer/16/website","https://opencollective.com/database_consistency/backer/17/website","https://opencollective.com/database_consistency/backer/18/website","https://opencollective.com/database_consistency/backer/19/website","https://opencollective.com/database_consistency/backer/20/website","https://opencollective.com/database_consistency/backer/21/website","https://opencollective.com/database_consistency/backer/22/website","https://opencollective.com/database_consistency/backer/23/website","https://opencollective.com/database_consistency/backer/24/website","https://opencollective.com/database_consistency/backer/25/website","https://opencollective.com/database_consistency/backer/26/website","https://opencollective.com/database_consistency/backer/27/website","https://opencollective.com/database_consistency/backer/28/website","https://opencollective.com/database_consistency/backer/29/website"],"categories":["Ruby","Programming Languages","Database Tools","Awesome Ruby CLIs","Gems"],"sub_categories":["Database","Database Integrity and Data Consistency"],"readme":"# DatabaseConsistency\n\n[![](https://badge.fury.io/rb/database_consistency.svg)](https://badge.fury.io/rb/database_consistency)\n[![](https://github.com/djezzzl/database_consistency/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/djezzzl/database_consistency/actions/workflows/tests.yml?query=event%3Aschedule)\n[![](https://github.com/djezzzl/database_consistency/actions/workflows/rubocop.yml/badge.svg?branch=master)](https://github.com/djezzzl/database_consistency/actions/workflows/rubocop.yml?query=event%3Aschedule)\n[![](https://opencollective.com/database_consistency/tiers/badge.svg)](https://opencollective.com/database_consistency#support)\n\nThe main goal of the project is to help you avoid various issues due to inconsistencies and inefficiencies between a database schema and application models.\n\n\u003e If the project helps you or your organization, I would be very grateful if you [contribute](https://github.com/djezzzl/database_consistency#contributing) or [donate](https://opencollective.com/database_consistency#support).  \n\u003e Your support is an incredible motivation and the biggest reward for my hard work.\n\n_The project is greatly supported by [Pennylane](https://www.pennylane.com)! Huge appreciation to the organization, and please join them if you find the gem valuable for you!_ \n\n\u003cdiv style=\"text-align: center\"\u003e\n    \u003cimg src=\"logos/pennylane.png\" width=\"200px\"/\u003e\n\u003c/div\u003e\n\nFor detailed information, please read the [wiki](docs/wiki/home.md).\n\nCurrently, the tool can:\n- [find missing null constraints](docs/wiki/ColumnPresenceChecker.md)\n- [find missing check constraints for numericality validations](docs/wiki/NumericalityConstraintChecker.md)\n- [find missing length validations](docs/wiki/LengthConstraintChecker.md)\n- [find missing presence validations](docs/wiki/NullConstraintChecker.md)\n- [find missing uniqueness validations](docs/wiki/UniqueIndexChecker.md)\n- [find missing foreign keys for `BelongsTo` associations](docs/wiki/ForeignKeyChecker.md)\n- [find missing unique indexes for uniqueness validation](docs/wiki/MissingUniqueIndexChecker.md)\n- [find missing indexes for `HasOne` and `HasMany` associations](docs/wiki/MissingIndexChecker.md)\n- [find primary keys with integer/serial type](docs/wiki/PrimaryKeyTypeChecker.md)\n- [find mismatching primary key types with their foreign keys](docs/wiki/ForeignKeyTypeChecker.md)\n- [find redundant non-unique indexes](docs/wiki/RedundantIndexChecker.md)\n- [find redundant uniqueness constraints](docs/wiki/RedundantUniqueIndexChecker.md)\n- [find mismatching enum types with their values](docs/wiki/EnumTypeChecker.md)\n- [find mismatching foreign key cascades](docs/wiki/ForeignKeyCascadeChecker.md)\n- [find inconsistent values between enums in the database and ActiveRecord's enums/inclusion validations](docs/wiki/EnumValueChecker.md)\n- [find redundant `case_sensitive: false` option for unique validations for case-insensitive types](docs/wiki/CaseSensitiveUniqueValidationChecker.md)\n- [find missing null constraints on boolean fields](docs/wiki/ThreeStateBooleanChecker.md)\n- [find broken associations that refer to non-existent models](docs/wiki/MissingAssociationClassChecker.md)\n- [find models that have missing tables](docs/wiki/MissingTableChecker.md)\n- [find models with UUID primary keys without specified ordering column](docs/wiki/ImplicitOrderingChecker.md)\n- [find belongs_to associations with foreign keys without dependent/on_delete options](docs/wiki/MissingDependentDestroyChecker.md)\n- [find polymorphic associations with mismatched foreign key and type null constraints](docs/wiki/PolymorphicAssociationNullabilityChecker.md)\n- [find columns used in `find_by` calls that are missing a database index](docs/wiki/MissingIndexFindByChecker.md)\n- [find models pointing to views without a primary_key set](docs/wiki/ViewPrimaryKeyChecker.md)\n\nBesides that, the tool provides:\n- [auto-correction](docs/wiki/auto-correction.md)\n- [flexible configuration](docs/wiki/configuration.md)\n- [slow start with TODO files](docs/wiki/generate-todo.md)\n- [support of custom checker](docs/wiki/custom-checker.md)\n\nWe support the following databases: `SQLite3`, `PostgreSQL` and `MySQL`.  \nWe support [ActiveRecord](https://github.com/rails/rails/tree/master/activerecord) only at the moment.\nPlease upvote the request for other frameworks if you're interested.\n\nFollow me and stay tuned for the updates:\n- [LinkedIn](https://www.linkedin.com/in/evgeniydemin/)\n- [Medium](https://evgeniydemin.medium.com/)\n- [Twitter](https://twitter.com/EvgeniyDemin/)\n- [GitHub](https://github.com/djezzzl)\n\n## Usage\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'database_consistency', group: :development, require: false\n```\n\nAnd then execute:\n\n```bash\n$ bundle install\n```\n\n### Example\n\n```bash\n$ bundle exec database_consistency\nNullConstraintChecker fail User code column is NOT NULL but does not have a validator disallowing nil values\nNullConstraintChecker fail User company_id column is NOT NULL but does not have a presence validator for association company\nLengthConstraintChecker fail Company note column has a character length limit but does not have a length validator\nMissingUniqueIndexChecker fail User name+email model should have a unique index in the database\nForeignKeyChecker fail User company should have a foreign key in the database\nForeignKeyTypeChecker fail User company foreign key (company_id) with type (integer(8)) does not match primary key (id) with type (integer)\nMissingIndexChecker fail Company user associated model should have an index in the database\nForeignKeyTypeChecker fail Company user foreign key (company_id) with type (integer(8)) does not match primary key (id) with type (integer)\nMissingIndexChecker fail Country users associated model should have an index in the database\nColumnPresenceChecker fail User phone column should be NOT NULL\nColumnPresenceChecker fail User name column is NOT NULL but may receive a NULL value\nUniqueIndexChecker fail User index_users_on_name_and_slug index is unique in the database but does not have a uniqueness validator\nRedundantUniqueIndexChecker fail User index_users_on_name_and_slug index uniqueness is redundant because (index_users_on_slug) covers it\nRedundantIndexChecker fail User index_users_on_phone index is redundant because (index_users_on_phone_and_slug) covers it\nColumnPresenceChecker fail User tmp column (tmp) is missing in table (users) but used for presence validation\nForeignKeyTypeChecker fail User something association (something) of class (User) relies on field (something_id) of table (users) but it is missing\nThreeStateBooleanChecker fail Company active boolean column should have NOT NULL constraint\nMissingAssociationClassChecker fail Company anything refers to a non-existent model \"Anything\"\nMissingTableChecker fail LegacyModel should have a corresponding table in the database\nImplicitOrderingChecker fail Secondary::User id setting implicit_order_column is recommended when using UUID as the primary key type\nMissingDependentDestroyChecker fail Organization company should have a corresponding has_one/has_many association with dependent option (destroy, delete, delete_all, nullify) or a foreign key with on_delete (cascade, nullify)\nMissingIndexFindByChecker fail User email column is used in find_by but is missing an index (found at app/models/user.rb:42)\nViewPrimaryKeyChecker fail ReportView self model pointing to a view should have primary_key set\n```\n\n## Funding\n\n### Open Collective Backers\n\nYou're an individual who wants to support the project with a monthly donation. Your logo will be available on the Github page. [[Become a backer](https://opencollective.com/database_consistency#backer)]\n\n\u003ca href=\"https://opencollective.com/database_consistency/backer/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/9/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/10/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/10/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/11/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/11/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/12/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/12/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/13/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/13/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/14/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/14/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/15/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/15/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/16/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/16/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/17/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/17/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/18/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/18/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/19/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/19/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/20/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/20/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/21/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/21/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/22/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/22/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/23/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/23/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/24/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/24/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/25/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/25/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/26/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/26/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/27/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/27/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/28/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/28/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/backer/29/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/backer/29/avatar.svg\"\u003e\u003c/a\u003e\n\n### Open Collective Sponsors\n\nYou're an organization that wants to support the project with a monthly donation. Your logo will be available on the Github page. [[Become a sponsor](https://opencollective.com/database_consistency#sponsor)]\n\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/10/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/10/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/11/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/11/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/12/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/12/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/13/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/13/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/14/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/14/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/15/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/15/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/16/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/16/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/17/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/17/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/18/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/18/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/19/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/19/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/20/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/20/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/21/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/21/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/22/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/22/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/23/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/23/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/24/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/24/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/25/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/25/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/26/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/26/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/27/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/27/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/28/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/28/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/database_consistency/sponsor/29/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/database_consistency/sponsor/29/avatar.svg\"\u003e\u003c/a\u003e\n\n## Contributing\n\n[Bug reports](https://github.com/djezzzl/database_consistency/issues) and [pull requests](https://github.com/djezzzl/database_consistency/pulls) are welcome on GitHub.\nThis project is intended to be a safe, welcoming space for collaboration, and contributors are expected\nto adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.\n\n### Contributors\n\n\u003cimg src=\"https://opencollective.com/database_consistency/contributors.svg?width=890\u0026button=false\" /\u003e\n\n## Code of Conduct\n\nEveryone interacting in the *DatabaseConsistency* project’s codebases, issue trackers, chat rooms\nand mailing lists is expected to\nfollow the [code of conduct](CODE_OF_CONDUCT.md).\n\n## Changelog\n\n*DatabaseConsistency*'s changelog is available [here](CHANGELOG.md).\n\n## Copyright\n\nCopyright (c) Evgeniy Demin. See [LICENSE.txt](LICENSE.txt) for further details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjezzzl%2Fdatabase_consistency","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdjezzzl%2Fdatabase_consistency","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjezzzl%2Fdatabase_consistency/lists"}