tortoise / aerich

A database migrations tool for TortoiseORM, ready to production.
https://github.com/tortoise/aerich
Apache License 2.0
804 stars 90 forks source link

Migrate from `CharField(...,unique=True)` to `CharField(...,unique=False)` raises tortoise.exceptions.OperationalError #336

Closed waketzheng closed 4 weeks ago

waketzheng commented 1 month ago

ERRORs: pymysql.err.OperationalError: (1091, "Can't DROP INDEX idx_user_name_76f409; check that it exists") tortoise.exceptions.OperationalError: (1091, "Can't DROP INDEX idx_user_name_76f409; check that it exists")

How to reproduce:

app = FastAPI()

fastapi_cdn_host.patch_docs(app)

TORTOISE_ORM = {

"connections": {"default": "sqlite://db.sqlite3"},

"connections": {"default": "mysql://root:123456@127.0.0.1:3306/test"},
"apps": {
    "models": {
        "models": ["models", "aerich.models"],
    },
},

}

register_tortoise( app, config=TORTOISE_ORM, generate_schemas=True, add_exception_handlers=True, )

@app.get("/") async def users(): objs = await User.all() return [dict(i) for i in objs]

@app.post("/") async def create_user(name: str): obj = await User.create(name=name) return dict(obj)

- models.py
```py
from tortoise import fields, models

class User(models.Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=10, unique=True)

shell commands:

python3.11 -m venv venv
source venv/*/activate
pip install fastapi aerich aiomysql
aerich init -t app.TORTOISE_ORM
# Success create migrate location ./migrations
# Success write config to pyproject.toml
aerich init-db
# Success create app migrate location migrations/models
# Success generate schema for app "models"
python -c 'from pathlib import Path;p=Path("models.py");p.write_text(p.read_text().replace("unique=True", "unique=False"))'
aerich migrate
# Success migrate 1_20240529111605_update.py
aerich upgrade
waketzheng commented 1 month ago

async def upgrade(db: BaseDBAsyncClient) -> str: return """ CREATE TABLE IF NOT EXISTS user ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(10) NOT NULL UNIQUE ) CHARACTER SET utf8mb4; CREATE TABLE IF NOT EXISTS aerich ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, version VARCHAR(255) NOT NULL, app VARCHAR(100) NOT NULL, content JSON NOT NULL ) CHARACTER SET utf8mb4;"""

async def downgrade(db: BaseDBAsyncClient) -> str: return """ """

- cat migrations/models/1_20240529115720_update.py
```py
from tortoise import BaseDBAsyncClient

async def upgrade(db: BaseDBAsyncClient) -> str:
    return """
        ALTER TABLE `user` DROP INDEX `idx_user_name_76f409`;"""

async def downgrade(db: BaseDBAsyncClient) -> str:
    return """
        ALTER TABLE `user` ADD UNIQUE INDEX `uid_user_name_76f409` (`name`);"""