@@ -63,14 +63,13 @@ def _post_init(self):
6363 from vanna .integrations .sqlite import SqliteRunner
6464 from vanna .integrations .postgres import PostgresRunner
6565 from vanna .integrations .mysql import MySQLRunner
66+ from .clickhouse .sql_runner import ClickHouseRunner
6667 from vanna .tools import LocalFileSystem
6768 from vanna .integrations .local .agent_memory import DemoAgentMemory
6869
69- # 验证连接字符串格式
7070 if not self .connection_string :
7171 raise ValueError ("Connection string cannot be empty" )
7272
73- # 检查连接字符串格式
7473 if self .connection_string .startswith ("sqlite://" ):
7574 if len (self .connection_string ) <= len ("sqlite://" ):
7675 raise ValueError (
@@ -128,9 +127,56 @@ def _post_init(self):
128127 )
129128 except (IndexError , ValueError ) as e :
130129 raise ValueError (f"Invalid MySQL connection string format: { e } " ) from e
130+ elif self .connection_string .startswith ("clickhouse://" ):
131+ try :
132+ from urllib .parse import urlparse , parse_qs
133+
134+ parsed = urlparse (self .connection_string )
135+
136+ user = parsed .username
137+ password = parsed .password
138+ host = parsed .hostname
139+ port = parsed .port or 8123
140+ database = parsed .path .lstrip ("/" )
141+
142+ query_params = parse_qs (parsed .query )
143+ kwargs = {}
144+
145+ for key , values in query_params .items ():
146+ if not values :
147+ continue
148+
149+ value = values [0 ]
150+
151+ if value .lower () in ("true" , "false" , "1" , "0" , "yes" , "no" ):
152+ kwargs [key ] = value .lower () in ("true" , "1" , "yes" )
153+ elif value .isdigit ():
154+ kwargs [key ] = int (value )
155+ elif value .replace ("." , "" , 1 ).isdigit ():
156+ kwargs [key ] = float (value )
157+ else :
158+ kwargs [key ] = value
159+
160+ if not all ([user , password , host , database ]):
161+ raise ValueError (
162+ "Missing required connection parameters (user, password, host, database)"
163+ )
164+
165+ self .runner = ClickHouseRunner (
166+ host = host ,
167+ database = database ,
168+ user = user ,
169+ password = password ,
170+ port = port ,
171+ ** kwargs ,
172+ )
173+ except (IndexError , ValueError , AttributeError ) as e :
174+ raise ValueError (
175+ f"Invalid ClickHouse connection string format: { e } "
176+ ) from e
131177 else :
132178 raise ValueError (
133- "Unsupported connection string format. Please use sqlite://, postgresql://, or mysql ://"
179+ "Unsupported connection string format. Please use sqlite://, postgresql://, mysql://, or clickhouse ://"
134180 )
135181
136182 if not os .path .exists (self .file_storage ):
0 commit comments