kvesteri/sqlalchemy-i18n

1.1.0 breaks compatibility with SQLAlchemy 1.3

kevinvalk opened this issue · 1 comments

Hi, great work!

After updating SQLAlchemy-18n to 1.1.0 without updating SQLAlchemy itself (still at 1.3.22), I got the following error when running flask db upgrade.

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 747, in __getattr__
    return getattr(self.comparator, key)
AttributeError: 'Comparator' object has no attribute '_copy'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/bin/flask", line 8, in <module>
    sys.exit(main())
  File "/home/app/.local/lib/python3.9/site-packages/flask/cli.py", line 967, in main
    cli.main(args=sys.argv[1:], prog_name="python -m flask" if as_module else None)
  File "/home/app/.local/lib/python3.9/site-packages/flask/cli.py", line 586, in main
    return super(FlaskGroup, self).main(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/click/decorators.py", line 21, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/home/app/.local/lib/python3.9/site-packages/flask/cli.py", line 425, in decorator
    with __ctx.ensure_object(ScriptInfo).load_app().app_context():
  File "/home/app/.local/lib/python3.9/site-packages/flask/cli.py", line 392, in load_app
    app = locate_app(self, import_name, None, raise_if_not_found=False)
  File "/home/app/.local/lib/python3.9/site-packages/flask/cli.py", line 240, in locate_app
    __import__(module_name)
  File "/app/app.py", line 3, in <module>
    app = lballet.create_app()
  File "/app/lballet/__init__.py", line 87, in create_app
    lballet.email.init_app(app)
  File "/app/lballet/email.py", line 53, in init_app
    from lballet.models import Newsletter, User
  File "/app/lballet/models.py", line 196, in <module>
    class LessonTranslation(translation_base(Lesson)):
  File "/home/app/.local/lib/python3.9/site-packages/sqlalchemy_i18n/manager.py", line 54, in translation_base
    column_copy = column._copy()
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 749, in __getattr__
    util.raise_(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute '_copy'

Updating SQLAlchemy to 1.4.18 resolved the issue. However, it would be best to not break compatibility on a minor version bump like 1.1.0.

There are also people who won't be able to upgrade to 1.4 yet due to other dependencies. .copy is deprecated in 1.4 but works for now. I'd suggest reverting the change and releasing 1.1.1.

Alternatively:

The :meth:_schema.Table.tometadata method is the public API that provides copying for :class:_schema.Table objects.

Happy to look into this but it won't be immediately.