11from dataclasses import dataclass , field
2- from typing import List
2+ from typing import Any , Dict , List , Tuple , Type
33
44import duckdb
55from sqlalchemy .dialects .postgresql import dialect as postgres_dialect
6+ from sqlalchemy .engine import URL
67
78
89class DBAPI :
@@ -17,25 +18,27 @@ class ConnectionWrapper:
1718 c : duckdb .DuckDBPyConnection
1819 notices : List [str ] = field (default_factory = list )
1920
20- def cursor (self ):
21+ def cursor (self ) -> "ConnectionWrapper" :
2122 return self
2223
23- def fetchmany (self , size = None ):
24+ def fetchmany (self , size : int = None ) -> List :
2425 # TODO: remove this once duckdb supports fetchmany natively
2526 return self .c .fetch_df_chunk ().values .tolist ()
2627
27- def __getattr__ (self , name ) :
28+ def __getattr__ (self , name : str ) -> Any :
2829 return getattr (self .c , name )
2930
3031 @property
31- def connection (self ):
32+ def connection (self ) -> "ConnectionWrapper" :
3233 return self
3334
34- def close (self ):
35+ def close (self ) -> None :
3536 # duckdb doesn't support 'soft closes'
3637 pass
3738
38- def execute (self , statement , parameters = None , context = None ):
39+ def execute (
40+ self , statement : str , parameters : Dict = None , context : Any = None
41+ ) -> None :
3942 if parameters is None :
4043 self .c .execute (statement )
4144 else :
@@ -47,37 +50,41 @@ class Dialect(postgres_dialect):
4750 identifier_preparer = None
4851 # colspecs TODO: remap types to duckdb types
4952
50- def connect (self , * args , ** kwargs ) :
53+ def connect (self , * args : Any , ** kwargs : Any ) -> ConnectionWrapper :
5154 return ConnectionWrapper (duckdb .connect (* args , ** kwargs ))
5255
53- def on_connect (self ):
56+ def on_connect (self ) -> None :
5457 pass
5558
56- def ddl_compiler (self , dialect , ddl , ** kwargs ):
59+ def ddl_compiler (
60+ self , dialect : str , ddl : Any , ** kwargs : Any
61+ ) -> postgres_dialect .ddl_compiler :
5762 # TODO: enforce no `serial` type
5863
5964 # duckdb doesn't support foreign key constraints (yet)
6065 ddl .include_foreign_key_constraints = {}
6166 return postgres_dialect .ddl_compiler (dialect , ddl , ** kwargs )
6267
63- def do_execute (self , cursor , statement , parameters , context ):
68+ def do_execute (
69+ self , cursor : ConnectionWrapper , statement : str , parameters : Any , context : Any
70+ ) -> None :
6471 cursor .execute (statement , parameters , context )
6572
6673 @staticmethod
67- def dbapi ():
74+ def dbapi () -> Type [ DBAPI ] :
6875 return DBAPI
6976
70- def create_connect_args (self , u ) :
77+ def create_connect_args (self , u : URL ) -> Tuple [ Tuple , Dict ] :
7178 return (), {"database" : u .render_as_string (hide_password = False ).split ("///" )[1 ]}
7279
73- def initialize (self , connection ) :
80+ def initialize (self , connection : ConnectionWrapper ) -> None :
7481 pass
7582
76- def do_rollback (self , connection ) :
83+ def do_rollback (self , connection : ConnectionWrapper ) -> None :
7784 pass
7885
7986 @classmethod
80- def get_dialect_cls (cls , u ) :
87+ def get_dialect_cls (cls , u : str ) -> Type [ "Dialect" ] :
8188 return cls
8289
8390
0 commit comments