bifroest/services/db-mcp/dbmcp/core/driver.py
2026-10-27 08:34:17 +01:00

43 lines
1.4 KiB
Python

"""Schnittstelle, die jeder Datenbanktyp umsetzt."""
from contextlib import AbstractContextManager
from dataclasses import dataclass
from typing import Protocol
from dbmcp.core.connection import Connection
from dbmcp.core.result import Table
@dataclass(frozen=True)
class Check:
version: str
tables: int
# Objekte, auf die der Nutzer schreiben darf; empfohlen ist 0 (Rolle nur mit SELECT)
writable: int
# Weitere Hinweise, z. B. systemweite Schreibrechte (Oracle: INSERT ANY TABLE)
note: str = ""
class Session(Protocol):
def check(self) -> Check: ...
def tables(self, limit: int) -> Table:
"""Spalten: schema, name, type (table|view), rows_estimate, comment."""
def describe(self, table: str, sample_rows: int) -> tuple[Table, Table]:
"""Spalten der Tabelle (name, type, nullable, comment) und die ersten Zeilen."""
def query(self, sql: str, max_rows: int) -> Table: ...
class Driver(Protocol):
name: str # Anzeigename, z. B. "PostgreSQL"
key: str # Kurzname für Dienst und Image, z. B. "postgres" -> db-mcp-postgres
default_port: int
# Hinweise zum SQL-Dialekt für die Anleitung an das Modell
dialect: str
# Erlaubte erste Schlüsselwörter einer Abfrage
starts: tuple[str, ...]
def session(self, connection: Connection) -> AbstractContextManager[Session]:
"""Verbindung mit schreibgeschützter Transaktion, die am Ende zurückgerollt wird."""