@@ -67,6 +67,51 @@ def do_connect(
67
67
)
68
68
self ._meta = sa .MetaData (bind = self .con )
69
69
70
+ def register (
71
+ self ,
72
+ file_name : str | Path ,
73
+ table_name : str | None = None ,
74
+ ) -> None :
75
+ """Register an external file (csv or parquet) as a table in the current
76
+ connection database
77
+
78
+ Parameters
79
+ ----------
80
+ file_name
81
+ Name of the parquet or CSV file
82
+ table_name
83
+ Name for the created table. Defaults to filename if not given
84
+ """
85
+ file_name = Path (file_name )
86
+ suffix = "" .join (file_name .suffixes ).strip ("." ) # handles .csv.gz
87
+ if file_name .parts [0 ].endswith (":" ):
88
+ prefix , * fname = file_name .parts
89
+ else :
90
+ prefix = "file:"
91
+ fname = file_name .parts
92
+
93
+ file_name = Path (* fname ).absolute ()
94
+
95
+ # Use prefix for file_type. If omitted, infer from file extension
96
+ file_type = prefix .strip (":" ) if prefix != "file:" else suffix
97
+ table_name = table_name or file_name .stem .replace ("-" , "_" )
98
+ if file_type == "parquet" :
99
+ view = f"""
100
+ CREATE VIEW { table_name } as SELECT * from
101
+ read_parquet('{ file_name } ')
102
+ """
103
+ elif file_type .startswith ("csv" ):
104
+ view = f"""
105
+ CREATE VIEW { table_name } as SELECT * from
106
+ read_csv_auto('{ file_name } ')
107
+ """
108
+ else :
109
+ raise TypeError (
110
+ "Only csv and parquet files can be registered with DuckDB."
111
+ )
112
+
113
+ self .con .execute (view )
114
+
70
115
def fetch_from_cursor (
71
116
self ,
72
117
cursor : duckdb .DuckDBPyConnection ,
0 commit comments