Skip to content

Computed statements containing newlines cause warnings on autogenerate #1391

@GeorchW

Description

@GeorchW

Describe the bug
When using ORM code that contains multi-line computed statements, they always generate warnings when being fed into Alembic. Like this:

class MyModel(Base):
    ...
    whatever: Mapped[int] = mapped_column(Computed("""1
        + 2""")) # just a simple multi-line expression for demo purposes
    # makes more sense with longer expressions

Alembic will always complain with "UserWarning: Computed default on MyModel.start_holding cannot be modified".

Expected behavior
No warning should appear as long as the expression does not change.

To Reproduce

Please try to provide a Minimal, Complete, and Verifiable example, with the migration script and/or the SQLAlchemy tables or models involved.
See also Reporting Bugs on the website.

This is the model:

from sqlalchemy import Computed
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column


class Base(DeclarativeBase):
    pass


class MyModel(Base):
    __tablename__ = "mymodel"
    id: Mapped[int] = mapped_column(primary_key=True)
    whatever: Mapped[int] = mapped_column(Computed("""1
        + 2"""))  # just a simple multi-line expression for demo purposes
    # makes more sense with longer expressions

The reproduction does not work with sqlite, since it stores the SQL expressions verbatim, but the warning does appear for MySQL. Start a MySQL container:

docker run --rm -p 1234:3306 --env MYSQL_ALLOW_EMPTY_PASSWORD=1 --name tmp mysql

Then initialize alembic and create a first revision:

alembic init alembic

Set the correct URL in the alembic.ini file:

sqlalchemy.url = mysql+pymysql://root:@localhost:1234/mysql

Set the correct metadata in env.py:

...
import demo
target_metadata = demo.Base.metadata
...

Generate a first revision and upgrade the database:

alembic revision --autogenerate
alembic upgrade head

Now, when generating additional revisions, a warning will appear:

alembic revision --autogenerate

Error

venv/lib/python3.11/site-packages/alembic/autogenerate/compare.py:1037: UserWarning: Computed default on mymodel.whatever cannot be modified
  util.warn("Computed default on %s.%s cannot be modified" % (tname, cname))
  Generating ./alembic/versions/3b750bbd8b7c_.py ...  done

Versions.

  • OS: Linux
  • Python: 3.11.7
  • Alembic: 1.13.1
  • SQLAlchemy: 2.0.25
  • Database: MySQL 8.2.0
  • DBAPI: pymysql

Additional context

Phew, that was a lot of work to write for a two-line PR!

Have a nice day!

Metadata

Metadata

Assignees

No one assigned

    Labels

    autogenerate - detectionuse casenot quite a feature and not quite a bug, something we just didn't think of

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions