yokadi icon indicating copy to clipboard operation
yokadi copied to clipboard

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

Open svbatalov opened this issue 7 months 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