sqlalchemy-lsp
Language server for SQLAlchemy ORM and Alembic. Diagnostics, completions, hover, navigation, and a headless CLI linter — one Rust binary, any LSP-capable editor.
Features
| Diagnostics | missing tablename, duplicate tablename/column, unknown FK table/column, FK type mismatch, relationship wiring errors, back_populates mismatch, uselist mismatch, orphan cascades, circular relationships, Alembic migration checks |
| Completions | FK strings, relationship() kwargs and values, mapped_column() kwargs, __table_args__ column names, model-constructor keywords, Alembic op.* names and arguments, snippets |
| Hover | model card, column card (type, nullability, FK target, indexes), FK resolution, relationship card, cascade tokens, back_populates counterpart |
| Navigation | go-to-definition, find references, rename — models, columns, relationships, FK targets |
| Signature help | model constructors, relationship() kwargs |
| Symbols | models and Alembic revisions in the symbol picker |
| Inlay hints | resolved FK targets inline |
| Code actions | generate __tablename__, fix back_populates, add missing FK column |
| Schema view | ER diagram of the workspace models |
check CLI |
same diagnostics as the LSP — sqlalchemy-lsp check . |
Diagnostics
| Code | Severity | What it catches |
|---|---|---|
SQLA-W101 |
warning | missing __tablename__ |
SQLA-E102 |
error | duplicate __tablename__ |
SQLA-E103 |
error | duplicate column name |
SQLA-E105 |
error | __table_args__ references unknown column |
SQLA-W201 |
warning | nullable=True column typed as non-optional |
SQLA-E301 |
error | FK references unknown table |
SQLA-E302 |
error | FK references unknown column |
SQLA-W303 |
warning | FK type mismatch |
SQLA-E401 |
error | relationship target not found |
SQLA-W402 |
warning | back_populates points at wrong attribute |
SQLA-W403 |
warning | back_populates target not found |
SQLA-W404 |
warning | uselist disagrees with cardinality |
SQLA-W405 |
warning | relationship target mismatch |
SQLA-H406 |
hint | missing FK for relationship |
SQLA-H407 |
hint | one-to-one missing unique=True |
SQLA-W408 |
warning | unknown cascade token |
SQLA-W409 |
warning | orphan cascade without delete |
SQLA-H410 |
hint | circular relationship |
Best-practice lints (SQLA-W1xx–SQLA-H4xx) default on and cover modernization, nullable hygiene, and Alembic migration checks.
Installation
uv tool install sqlalchemy-lsp
Or with pip:
pip install sqlalchemy-lsp
Or download a pre-built binary from the releases page.
Configuration
Zero config for standard projects. Place a sqlalchemy-lsp.toml or [tool.sqlalchemy-lsp] section in pyproject.toml at the project root.
# sqlalchemy-lsp.toml
# Path to the declarative base (auto-detected if absent)
# base = "app/database.py"
# Extra source roots for import resolution
# source_roots = ["src"]
[diagnostics]
# Run only these codes
# select = ["SQLA-E301", "SQLA-E401"]
# Suppress codes
ignore = ["SQLA-H406"]
# Override severity per code
[diagnostics.severity]
"SQLA-W303" = "error"
Suppress a single line with # noqa or # noqa: SQLA-W303.
CLI
# Run diagnostics
sqlalchemy-lsp check .
sqlalchemy-lsp check app/models/ --select SQLA-E3xx --ignore SQLA-H406
sqlalchemy-lsp check --format json
# Print the workspace ER schema
sqlalchemy-lsp schema
# Print model statistics
sqlalchemy-lsp stats
Editor Setup
Zed
Install from the Zed extensions panel (Cmd+Shift+X) — search for sqlalchemy-lsp and click Install. It activates automatically for Python files.
To control server order alongside other language servers, add to ~/.config/zed/settings.json:
{
"languages": {
"Python": { "language_servers": ["sqlalchemy-lsp", "..."] }
}
}
Helix
Merge editors/helix/languages.toml into ~/.config/helix/languages.toml.
Neovim
Requires Neovim 0.11+. Use the snippet from editors/neovim/sqlalchemy_lsp.lua or add to your init.lua:
vim.lsp.config('sqlalchemy_lsp', {
cmd = { 'sqlalchemy-lsp', 'lsp', '--stdio' },
filetypes = { 'python' },
root_markers = { 'pyproject.toml', 'sqlalchemy-lsp.toml', 'alembic.ini', '.git' },
})
vim.lsp.enable('sqlalchemy_lsp')
Other editors
The server speaks standard LSP over stdio:
sqlalchemy-lsp lsp --stdio
License
MIT
Metadata
Release files for sqlalchemy-lsp 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| sqlalchemy_lsp-0.2.2-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details for sqlalchemy_lsp-0.2.2-py3-none-win_amd64.whl |
| sqlalchemy_lsp-0.2.2-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details for sqlalchemy_lsp-0.2.2-py3-none-manylinux_2_28_x86_64.whl |
| sqlalchemy_lsp-0.2.2-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details for sqlalchemy_lsp-0.2.2-py3-none-manylinux_2_28_aarch64.whl |
| sqlalchemy_lsp-0.2.2-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details for sqlalchemy_lsp-0.2.2-py3-none-macosx_11_0_arm64.whl |
| sqlalchemy_lsp-0.2.2-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details for sqlalchemy_lsp-0.2.2-py3-none-macosx_10_12_x86_64.whl |
Total release size: 12.0 MB
Release files / sqlalchemy_lsp-0.2.2-py3-none-win_amd64.whl
| Download URL | sqlalchemy_lsp-0.2.2-py3-none-win_amd64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
9c239b8a0e9667978af4bc15dc00f03762033581b731fb65c39cfa40c3eb3b66
|
|
BLAKE2b-256 checksum How to use checksums |
de702009f954537977872a0c5935759be70db71978874b8e49115b495d4f1166
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sqlalchemy_lsp-0.2.2-py3-none-manylinux_2_28_x86_64.whl
| Download URL | sqlalchemy_lsp-0.2.2-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
bd657e66abc8f1e8b8b0c52a156efbe48932282eeafdb33ce34a792a9256dbd5
|
|
BLAKE2b-256 checksum How to use checksums |
af69149e5bd96f46a996aec7bacd47550d61cd393d3c380b0cf9879b8d892f8a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sqlalchemy_lsp-0.2.2-py3-none-manylinux_2_28_aarch64.whl
| Download URL | sqlalchemy_lsp-0.2.2-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
df4eea599ba8a381fc8ae44311d2e288fbfec1a86fd5b46b604bbe607fe94ef1
|
|
BLAKE2b-256 checksum How to use checksums |
7f9e258b4b0fff6e694854b30b9d497bc1b69e7c0812ea5cc1452d0d6c2ea709
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sqlalchemy_lsp-0.2.2-py3-none-macosx_11_0_arm64.whl
| Download URL | sqlalchemy_lsp-0.2.2-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a31e884a7d6e658222e352d0c313503e0da00e624ce586142d289d1511efa220
|
|
BLAKE2b-256 checksum How to use checksums |
fb5ce717d770b53f84edcc5a8cb6242a7145356f4a8d4593826d943b78e64015
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sqlalchemy_lsp-0.2.2-py3-none-macosx_10_12_x86_64.whl
| Download URL | sqlalchemy_lsp-0.2.2-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
e6904d2aa70a7ded310a1ecab283daee3cdd1a896bba1cbb5ca765550e7629a6
|
|
BLAKE2b-256 checksum How to use checksums |
638c62c3673f9c28fcf8cb0afb2f257a97713d0e99c77f4cf5e70e83b323e9f6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for sqlalchemy-lsp 0.2.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.