🐣

DuckDBが急に使えなくなったときの対処法

に公開

目的

生成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)


![](/images/スクリーンショット 2024-10-19 120258.png)

対処方法

これまで起きたことがないエラーだったので、焦ったのですがエラーメッセージで出ている「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の場合

  1. (MotherDuck)[https://app.motherduck.com/]にアクセスして、Notebookを新規作成
  2. エラーになったデータベース(ここでは、mydb)を選んで、「CREATE TYPE REGCLASS AS VARCHAR;」として実行

image.png

Discussion