{"id":13461704,"url":"https://github.com/sqlalchemy/sqlalchemy","last_synced_at":"2025-09-09T21:10:46.085Z","repository":{"id":37276094,"uuid":"159271175","full_name":"sqlalchemy/sqlalchemy","owner":"sqlalchemy","description":"The Database Toolkit for Python","archived":false,"fork":false,"pushed_at":"2025-09-05T17:23:04.000Z","size":93677,"stargazers_count":10852,"open_issues_count":228,"forks_count":1578,"subscribers_count":103,"default_branch":"main","last_synced_at":"2025-09-05T18:26:26.152Z","etag":null,"topics":["python","sql","sqlalchemy"],"latest_commit_sha":null,"homepage":"https://www.sqlalchemy.org","language":"Python","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/sqlalchemy.png","metadata":{"files":{"readme":"README.dialects.rst","changelog":"CHANGES.rst","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"sqlalchemy","patreon":"zzzeek","tidelift":"pypi/SQLAlchemy"}},"created_at":"2018-11-27T03:35:03.000Z","updated_at":"2025-09-05T17:23:10.000Z","dependencies_parsed_at":"2023-10-14T20:55:09.029Z","dependency_job_id":"72769685-e5df-4820-80f2-dbfda74e23e2","html_url":"https://github.com/sqlalchemy/sqlalchemy","commit_stats":{"total_commits":14759,"total_committers":743,"mean_commits":19.86406460296097,"dds":"0.22731892404634457","last_synced_commit":"b0d9d5a44cdd5632d209149a6a6622073acee3da"},"previous_names":[],"tags_count":324,"template":false,"template_full_name":null,"purl":"pkg:github/sqlalchemy/sqlalchemy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sqlalchemy%2Fsqlalchemy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sqlalchemy%2Fsqlalchemy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sqlalchemy%2Fsqlalchemy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sqlalchemy%2Fsqlalchemy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sqlalchemy","download_url":"https://codeload.github.com/sqlalchemy/sqlalchemy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sqlalchemy%2Fsqlalchemy/sbom","scorecard":{"id":685647,"data":{"date":"2025-08-11","repo":{"name":"github.com/sqlalchemy/sqlalchemy","commit":"de89d598744edc9365279a682a95e198dfbf1f29"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.6,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 24 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: .github/SECURITY.md:1","Info: Found linked content: .github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: .github/SECURITY.md:1","Info: Found text in security policy: .github/SECURITY.md:1"],"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":"Code-Review","score":0,"reason":"Found 1/30 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/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/create-wheels.yaml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/run-on-pr.yaml:16","Info: topLevel 'contents' permission set to 'read': .github/workflows/run-test.yaml:19","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":"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:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: OSSFuzz integration found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"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/create-wheels.yaml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/create-wheels.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/create-wheels.yaml:82: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/create-wheels.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/create-wheels.yaml:91: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/create-wheels.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/create-wheels.yaml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/create-wheels.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-on-pr.yaml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/run-on-pr.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-on-pr.yaml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/run-on-pr.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-on-pr.yaml:75: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/run-on-pr.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-on-pr.yaml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/run-on-pr.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-test.yaml:99: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/run-test.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-test.yaml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/run-test.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-test.yaml:151: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/run-test.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-test.yaml:154: update your workflow using https://app.stepsecurity.io/secureworkflow/sqlalchemy/sqlalchemy/run-test.yaml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/create-wheels.yaml:98","Warn: pipCommand not pinned by hash: .github/workflows/create-wheels.yaml:100","Warn: pipCommand not pinned by hash: .github/workflows/create-wheels.yaml:124","Warn: pipCommand not pinned by hash: .github/workflows/run-on-pr.yaml:50","Warn: pipCommand not pinned by hash: .github/workflows/run-on-pr.yaml:51","Warn: pipCommand not pinned by hash: .github/workflows/run-on-pr.yaml:85","Warn: pipCommand not pinned by hash: .github/workflows/run-on-pr.yaml:86","Warn: pipCommand not pinned by hash: .github/workflows/run-test.yaml:115","Warn: pipCommand not pinned by hash: .github/workflows/run-test.yaml:116","Warn: pipCommand not pinned by hash: .github/workflows/run-test.yaml:161","Warn: pipCommand not pinned by hash: .github/workflows/run-test.yaml:162","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of  11 pipCommand 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 1 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"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact rel_2_0_43 not signed: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/239054609","Warn: release artifact rel_2_0_42 not signed: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/235952873","Warn: release artifact rel_2_0_41 not signed: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/218626787","Warn: release artifact rel_2_0_40 not signed: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/208760219","Warn: release artifact rel_2_0_39 not signed: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/205107760","Warn: release artifact rel_2_0_43 does not have provenance: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/239054609","Warn: release artifact rel_2_0_42 does not have provenance: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/235952873","Warn: release artifact rel_2_0_41 does not have provenance: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/218626787","Warn: release artifact rel_2_0_40 does not have provenance: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/208760219","Warn: release artifact rel_2_0_39 does not have provenance: https://api.github.com/repos/sqlalchemy/sqlalchemy/releases/205107760"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}}]},"last_synced_at":"2025-08-22T00:42:34.683Z","repository_id":37276094,"created_at":"2025-08-22T00:42:34.683Z","updated_at":"2025-08-22T00:42:34.683Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273846540,"owners_count":25178627,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-05T02:00:09.113Z","response_time":402,"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":["python","sql","sqlalchemy"],"created_at":"2024-07-31T11:00:53.359Z","updated_at":"2025-09-09T21:10:46.012Z","avatar_url":"https://github.com/sqlalchemy.png","language":"Python","funding_links":["https://github.com/sponsors/sqlalchemy","https://patreon.com/zzzeek","https://tidelift.com/funding/github/pypi/SQLAlchemy"],"categories":["Python","ORM","Databases","Data Management \u0026 Processing","ORMs \u0026 Query Builders","Database Clients","📚 فهرست","wrapper/ORM","🗃️ SQL \u0026 Databases"],"sub_categories":["Database \u0026 Cloud Management","Python","دیتابیس","Tools"],"readme":"========================\nDeveloping new Dialects\n========================\n\n.. note::\n\n   When studying this file, it's probably a good idea to also\n   familiarize with the  README.unittests.rst file, which discusses\n   SQLAlchemy's usage and extension of the pytest test runner.\n\nWhile SQLAlchemy includes many dialects within the core distribution, the\ntrend for new dialects should be that they are published as external\nprojects.   SQLAlchemy has since version 0.5 featured a \"plugin\" system\nwhich allows external dialects to be integrated into SQLAlchemy using\nstandard setuptools entry points.  As of version 0.8, this system has\nbeen enhanced, so that a dialect can also be \"plugged in\" at runtime.\n\nOn the testing side, SQLAlchemy includes a \"dialect compliance\nsuite\" that is usable by third party libraries, in the source tree\nat ``lib/sqlalchemy/testing/suite``.   There's no need for a third party\ndialect to run through SQLAlchemy's full testing suite, as a large portion of\nthese tests do not have dialect-sensitive functionality.  The \"dialect\ncompliance suite\" should be viewed as the primary target for new dialects.\n\n\nDialect Layout\n===============\n\nThe file structure of a dialect is typically similar to the following:\n\n.. sourcecode:: text\n\n    sqlalchemy-\u003cdialect\u003e/\n                         setup.py\n                         setup.cfg\n                         sqlalchemy_\u003cdialect\u003e/\n                                              __init__.py\n                                              base.py\n                                              \u003cdbapi\u003e.py\n                                              requirements.py\n                         test/\n                                              __init__.py\n                                              conftest.py\n                                              test_suite.py\n                                              test_\u003cdialect_specific_test\u003e.py\n                                              ...\n\nAn example of this structure can be seen in the MS Access dialect at\nhttps://github.com/gordthompson/sqlalchemy-access .\n\nKey aspects of this file layout include:\n\n* setup.py - should specify setuptools entrypoints, allowing the\n  dialect to be usable from create_engine(), e.g.::\n\n        entry_points = {\n            \"sqlalchemy.dialects\": [\n                \"access.pyodbc = sqlalchemy_access.pyodbc:AccessDialect_pyodbc\",\n            ]\n        }\n\n  Above, the entrypoint ``access.pyodbc`` allow URLs to be used such as::\n\n    create_engine(\"access+pyodbc://user:pw@dsn\")\n\n* setup.cfg - this file contains the traditional contents such as\n  [tool:pytest] directives, but also contains new directives that are used\n  by SQLAlchemy's testing framework.  E.g. for Access:\n\n  .. sourcecode:: text\n\n    [tool:pytest]\n    addopts= --tb native -v -r fxX --maxfail=25 -p no:warnings\n    python_files=test/*test_*.py\n\n    [sqla_testing]\n    requirement_cls=sqlalchemy_access.requirements:Requirements\n    profile_file=test/profiles.txt\n\n    [db]\n    default=access+pyodbc://admin@access_test\n    sqlite=sqlite:///:memory:\n\n  Above, the ``[sqla_testing]`` section contains configuration used by\n  SQLAlchemy's test plugin.  The ``[tool:pytest]`` section\n  include directives to help with these runners.  When using pytest\n  the test/conftest.py file will bootstrap SQLAlchemy's plugin.\n\n* test/conftest.py - This script bootstraps SQLAlchemy's pytest plugin\n  into the pytest runner.  This\n  script can also be used to install your third party dialect into\n  SQLAlchemy without using the setuptools entrypoint system; this allows\n  your dialect to be present without any explicit setup.py step needed.\n  The other portion invokes SQLAlchemy's pytest plugin::\n\n    from sqlalchemy.dialects import registry\n    import pytest\n\n    registry.register(\"access.pyodbc\", \"sqlalchemy_access.pyodbc\", \"AccessDialect_pyodbc\")\n\n    pytest.register_assert_rewrite(\"sqlalchemy.testing.assertions\")\n\n    from sqlalchemy.testing.plugin.pytestplugin import *\n\n  Where above, the ``registry`` module, introduced in SQLAlchemy 0.8, provides\n  an in-Python means of installing the dialect entrypoint(s) without the use\n  of setuptools, using the ``registry.register()`` function in a way that\n  is similar to the ``entry_points`` directive we placed in our ``setup.py``.\n  (The ``pytest.register_assert_rewrite`` is there just to suppress a spurious\n  warning from pytest.)\n\n* requirements.py - The ``requirements.py`` file is where directives\n  regarding database and dialect capabilities are set up.\n  SQLAlchemy's tests are often annotated with decorators   that mark\n  tests as \"skip\" or \"fail\" for particular backends.  Over time, this\n  system   has been refined such that specific database and DBAPI names\n  are mentioned   less and less, in favor of @requires directives which\n  state a particular capability.   The requirement directive is linked\n  to target dialects using a ``Requirements`` subclass.   The custom\n  ``Requirements`` subclass is specified in the ``requirements.py`` file\n  and   is made available to SQLAlchemy's test runner using the\n  ``requirement_cls`` directive   inside the ``[sqla_testing]`` section.\n\n  For a third-party dialect, the custom ``Requirements`` class can\n  usually specify a simple yes/no answer for a particular system. For\n  example, a requirements file that specifies a database that supports\n  the RETURNING construct but does not support nullable boolean\n  columns might look like this::\n\n      # sqlalchemy_access/requirements.py\n\n      from sqlalchemy.testing.requirements import SuiteRequirements\n\n      from sqlalchemy.testing import exclusions\n\n\n      class Requirements(SuiteRequirements):\n          @property\n          def nullable_booleans(self):\n              \"\"\"Target database allows boolean columns to store NULL.\"\"\"\n              # Access Yes/No doesn't allow null\n              return exclusions.closed()\n\n          @property\n          def returning(self):\n              return exclusions.open()\n\n  The ``SuiteRequirements`` class in\n  ``sqlalchemy.testing.requirements`` contains a large number of\n  requirements rules, which attempt to have reasonable defaults. The\n  tests will report on those requirements found as they are run.\n\n  The requirements system can also be used when running SQLAlchemy's\n  primary test suite against the external dialect.  In this use case,\n  a ``--dburi`` as well as a ``--requirements`` flag are passed to SQLAlchemy's\n  test runner so that exclusions specific to the dialect take place:\n\n  .. sourcecode:: text\n\n    cd /path/to/sqlalchemy\n    pytest -v \\\n      --requirements sqlalchemy_access.requirements:Requirements \\\n      --dburi access+pyodbc://admin@access_test\n\n* test_suite.py - Finally, the ``test_suite.py`` module represents a\n  stub test suite, which pulls in the actual SQLAlchemy test suite.\n  To pull in the suite as a whole, it can   be imported in one step::\n\n      # test/test_suite.py\n\n      from sqlalchemy.testing.suite import *\n\n  That's all that's needed - the ``sqlalchemy.testing.suite`` package\n  contains an ever expanding series of tests, most of which should be\n  annotated with specific requirement decorators so that they can be\n  fully controlled.  In the case that the decorators are not covering\n  a particular test, a test can also be directly modified or bypassed.\n  In the example below, the Access dialect test suite overrides the\n  ``get_huge_int()`` test::\n\n      from sqlalchemy.testing.suite import *\n\n      from sqlalchemy.testing.suite import IntegerTest as _IntegerTest\n\n\n      class IntegerTest(_IntegerTest):\n\n          @testing.skip(\"access\")\n          def test_huge_int(self):\n              # bypass this test because Access ODBC fails with\n              # [ODBC Microsoft Access Driver] Optional feature not implemented.\n              return\n\nAsyncIO dialects\n----------------\n\nAs of version 1.4 SQLAlchemy supports also dialects that use\nasyncio drivers to interface with the database backend.\n\nSQLAlchemy's approach to asyncio drivers is that the connection and cursor\nobjects of the driver (if any) are adapted into a pep-249 compliant interface,\nusing the ``AdaptedConnection`` interface class. Refer to the internal asyncio\ndriver implementations such as that of ``asyncpg``, ``asyncmy`` and\n``aiosqlite`` for examples.\n\nGoing Forward\n==============\n\nThe third-party dialect can be distributed like any other Python\nmodule on PyPI. Links to prominent dialects can be featured within\nSQLAlchemy's own documentation; contact the developers (see AUTHORS)\nfor help with this.\n\nWhile SQLAlchemy includes many dialects built in, it remains to be\nseen if the project as a whole might move towards \"plugin\" model for\nall dialects, including all those currently built in.  Now that\nSQLAlchemy's dialect API is mature and the test suite is not far\nbehind, it may be that a better maintenance experience can be\ndelivered by having all dialects separately maintained and released.\n\nAs new versions of SQLAlchemy are released, the test suite and\nrequirements file will receive new tests and changes.  The dialect\nmaintainer would normally keep track of these changes and make\nadjustments as needed.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsqlalchemy%2Fsqlalchemy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsqlalchemy%2Fsqlalchemy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsqlalchemy%2Fsqlalchemy/lists"}