目的
生成AIでテーブルデータを扱うのにDuckDB(MotherDuck、ローカルDuckDB両方)を愛用しているのですが、エラーが出て急に使えなくなりました。
実行したコード
import duckdb
from langchain.sql_database import SQLDatabase
# LangChainモデルでDuckDBを使えるようにする
db = SQLDatabase.from_uri("duckdb:///drive/MyDrive/Colab Notebooks/duckdb.db") # GoogleDrive上の、ローカルDuckDBファイルを参照しています。
db.get_usable_table_names()
エラーメッセージ
ProgrammingError: (duckdb.duckdb.CatalogException) Catalog Error: Type with name REGCLASS does not exist!
[SQL: SELECT pg_catalog.pg_class.relname, pg_catalog.pg_description.description
FROM pg_catalog.pg_class LEFT OUTER JOIN pg_catalog.pg_description ON pg_catalog.pg_class.oid = pg_catalog.pg_description.objoid AND pg_catalog.pg_description.objsubid = $1 AND pg_catalog.pg_description.classoid = CAST($2 AS REGCLASS) JOIN pg_catalog.pg_namespace ON pg_catalog.pg_namespace.oid = pg_catalog.pg_class.relnamespace
WHERE pg_catalog.pg_class.relkind = ANY (ARRAY[$3, $4, $5]) AND pg_catalog.pg_table_is_visible(pg_catalog.pg_class.oid) AND pg_catalog.pg_namespace.nspname != $6 AND pg_catalog.pg_class.relname IN ($7)]
[parameters: (0, 'pg_catalog.pg_class', 'r', 'p', 'f', 'pg_catalog', 'transaction')]
(Background on this error at: https://sqlalche.me/e/20/f405)
対処方法
これまで起きたことがないエラーだったので、焦ったのですがエラーメッセージで出ている「REGCLASS」というタイプがないことを解消すれば、解決しました。
どちらも、わかってしまえば簡単な解決策なのですが、最初対策が分からずに30分くらい迷ってしまったので、備忘録もかねて記事化しておきました。
ローカルDuckDBの場合
ローカルのDuckDBをduckdb.connectで接続してから、「CREATE TYPE REGCLASS AS VARCHAR;」を実行
import duckdb
conn = duckdb.connect('/content/drive/MyDrive/Colab Notebooks/duckdb.db')
cursor = conn.cursor()
cursor.execute(
"CREATE TYPE REGCLASS AS VARCHAR;"
)
MotherDuckの場合
- (MotherDuck)[https://app.motherduck.com/]にアクセスして、Notebookを新規作成
- エラーになったデータベース(ここでは、mydb)を選んで、「CREATE TYPE REGCLASS AS VARCHAR;」として実行