{"id":157,"library":"sqlalchemy","title":"SQLAlchemy","description":"The most widely used Python SQL toolkit and ORM. v2.0 released January 2023 — massive breaking change from v1.x. The entire ORM query API shifted from session.query() to select(). engine.execute() removed. Passing raw strings to execute() removed. Typed mapped_column() replaces Column(). Current version: 2.0.48 (Mar 2026). Flask-SQLAlchemy's Model.query pattern is also legacy in v2.","status":"active","version":"2.0.48","language":"python","source_language":"en","source_url":"https://github.com/sqlalchemy/sqlalchemy","tags":["sqlalchemy","orm","sql","database","python","postgresql","sqlite"],"install":[{"cmd":"pip install sqlalchemy","lang":"bash","label":"Python (core)"},{"cmd":"pip install 'sqlalchemy[asyncio]'","lang":"bash","label":"Python (with async support)"}],"dependencies":[{"reason":"Required for async support. Install via sqlalchemy[asyncio].","package":"greenlet","optional":true},{"reason":"Required for PostgreSQL sync. Or use asyncpg for async.","package":"psycopg2","optional":true}],"imports":[{"wrong":"from sqlalchemy import select","symbol":"select","correct":"from sqlalchemy import select"},{"wrong":"from sqlalchemy.orm import Session","symbol":"Session","correct":"from sqlalchemy.orm import Session"}],"quickstart":{"code":"# pip install sqlalchemy\nfrom sqlalchemy import create_engine, String, select, text\nfrom sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session\n\nclass Base(DeclarativeBase):\n    pass\n\nclass User(Base):\n    __tablename__ = 'users'\n    id: Mapped[int] = mapped_column(primary_key=True)\n    name: Mapped[str] = mapped_column(String(50))\n\nengine = create_engine('sqlite:///test.db')\nBase.metadata.create_all(engine)\n\nwith Session(engine) as session:\n    # Insert\n    session.add(User(name='Alice'))\n    session.commit()\n\n    # Query — v2 style\n    stmt = select(User).where(User.name == 'Alice')\n    user = session.scalars(stmt).first()\n    print(user.name)  # 'Alice'","lang":"python","description":"SQLAlchemy 2.0 ORM quickstart with typed models."},"warnings":[{"fix":"Use 'with engine.connect() as conn: conn.execute(text(...))'","message":"engine.execute() removed in v2.0. Raises AttributeError. Most LLM-generated SQLAlchemy code uses engine.execute().","severity":"breaking","affected_versions":">= 2.0"},{"fix":"from sqlalchemy import text; conn.execute(text('SELECT 1'))","message":"Passing raw strings to execute() removed. conn.execute('SELECT 1') raises ArgumentError in v2.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"from sqlalchemy.orm import DeclarativeBase; class Base(DeclarativeBase): pass","message":"declarative_base() from sqlalchemy.ext.declarative is legacy in v2. Still works but generates RemovedIn20Warning.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"Replace session.query(Model).filter(...) with session.scalars(select(Model).where(...))","message":"session.query() is legacy in v2 — still works but not recommended. Flask-SQLAlchemy's Model.query is also legacy. LLMs trained pre-2023 generate session.query() patterns.","severity":"gotcha","affected_versions":">= 2.0"},{"fix":"users = session.scalars(select(User)).all() — not session.execute(select(User)).all()","message":"session.execute() now returns a Result object. For ORM models use session.scalars() to get model instances directly, not session.execute().","severity":"gotcha","affected_versions":">= 2.0"},{"fix":"Use 'with engine.begin() as conn:' for autocommit. Or call session.commit() explicitly.","message":"Autocommit behavior changed in v2. Connections no longer autocommit. Must explicitly use with engine.begin() for autocommit or session.commit().","severity":"gotcha","affected_versions":">= 2.0"},{"fix":"id: Mapped[int] = mapped_column(primary_key=True)","message":"Column() without type annotations still works but loses IDE/mypy type inference. mapped_column() with Mapped[] is the v2 typed approach.","severity":"gotcha","affected_versions":">= 2.0"}],"env_vars":null,"search_vec":"'2.0.48':45 '2023':14 '2026':47 'also':55 'api':24 'break':16 'chang':17 'column':40,42 'current':43 'databas':62 'engine.execute':30 'entir':21 'execut':36 'flask':49 'flask-sqlalchemi':48 'januari':13 'legaci':56 'map':39 'mar':46 'massiv':15 'model.query':52 'orm':10,22,60 'pass':32 'pattern':53 'postgresql':64 'python':6,63 'queri':23 'raw':33 'releas':12 'remov':31,37 'replac':41 'select':29 'session.query':27 'shift':25 'sql':7,61 'sqlalchemi':1,50,59 'sqlite':65 'string':34 'toolkit':8 'type':38 'use':5 'v1.x':19 'v2':58 'v2.0':11 'version':44 'wide':4","created_at":"2026-03-24T18:28:57.566921+00:00","updated_at":"2026-04-16T22:10:58.617443+00:00","problems":null,"ecosystem":"pypi","meta_description":null,"install_score":100,"quickstart_score":80,"quickstart_tag":"verified","pypi_latest":"2.0.52","cli_name":"","cli_version":null,"type":"library","homepage":"https://www.sqlalchemy.org","github":"https://github.com/sqlalchemy/sqlalchemy","docs":"https://docs.sqlalchemy.org","changelog":null,"pypi":"https://pypi.org/project/sqlalchemy/","npm":null,"openapi_spec":null,"status_page":null,"smithery":null,"categories":["database","web-framework"],"base_url":null,"auth_type":null,"provenance":{"verified_status":"passing","verified_at":"2026-06-30","last_verified":"2026-08-26","next_check":"2026-07-30","install_tag":"verified"}}