-
-
Notifications
You must be signed in to change notification settings - Fork 299
Description
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 expressionsAlembic 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 expressionsThe 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 mysqlThen initialize alembic and create a first revision:
alembic init alembicSet the correct URL in the alembic.ini file:
sqlalchemy.url = mysql+pymysql://root:@localhost:1234/mysqlSet 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 headNow, when generating additional revisions, a warning will appear:
alembic revision --autogenerateError
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!