yokadi icon indicating copy to clipboard operation
yokadi copied to clipboard

AttributeError: 'Engine' object has no attribute 'has_table'

Open svbatalov opened this issue 1 year ago • 2 comments

Hey!

This may be something related to my local environment, but after recent apt full-upgrade (I'm on Debian Trixie) I'm getting this error with yokadi:

$ yokadi
Traceback (most recent call last):
  File "/usr/bin/yokadi", line 11, in <module>
    main.main()
  File "/usr/lib/python3/dist-packages/yokadi/ycli/main.py", line 225, in main
    db.connectDatabase(dbPath)
  File "/usr/lib/python3/dist-packages/yokadi/core/db.py", line 304, in connectDatabase
    _database = Database(dbFileName, createIfNeeded, memoryDatabase)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/yokadi/core/db.py", line 348, in __init__
    self.checkVersion()
  File "/usr/lib/python3/dist-packages/yokadi/core/db.py", line 375, in checkVersion
    version = self.getVersion()
              ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/yokadi/core/db.py", line 357, in getVersion
    if not self.engine.has_table("config"):
           ^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Engine' object has no attribute 'has_table'

Quick googling reveals that engine.has_table() seems to be deprecated. My quick fix was to import inspect and use Inspector.has_table() instead:

$ git diff
diff --git a/yokadi/core/db.py b/yokadi/core/db.py
index c97b9db..2de4db9 100644
--- a/yokadi/core/db.py
+++ b/yokadi/core/db.py
@@ -12,7 +12,7 @@ import sys
 from datetime import datetime
 from uuid import uuid1

-from sqlalchemy import create_engine
+from sqlalchemy import create_engine, inspect
 from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy.ext.associationproxy import association_proxy
 from sqlalchemy.orm import scoped_session, sessionmaker, relationship
@@ -352,7 +352,8 @@ class Database(object):
         Base.metadata.create_all(self.engine)

     def getVersion(self):
-        if not self.engine.has_table("config"):
+        insp = inspect(self.engine)
+        if not insp.has_table("config"):
             # There was no Config table in v1
             return 1

Cheers, Sergey

svbatalov avatar Jul 30 '24 07:07 svbatalov

Hi, thanks for your report.

I investigated and was able to reproduce on a Trixie machine. This bug is caused by Yokadi Debian package now depending on SQLAlchemy 2.0. This version is not fully compatible with SQLAlchemy 1.4, on which Yokadi depends.

I think this is a packaging error, but I am going to look into porting Yokadi to SQLAlchemy 2.0, because I assume Debian cannot ship SQLAlchemy 1.4 and 2.0.

agateau avatar Jul 31 '24 06:07 agateau

Thanks @agateau ! And thank you for yokadi -- it's pretty cool!

svbatalov avatar Jul 31 '24 06:07 svbatalov

This is fixed with Yokadi 1.3.0, released yesterday.

agateau avatar Nov 06 '24 07:11 agateau