22
33CREATE TABLE → creates a worksheet and writes column metadata.
44DROP TABLE → deletes the worksheet and removes metadata.
5- ALTER TABLE → rejected (not supported) .
5+ ALTER TABLE → supports ADD/DROP/RENAME COLUMN .
66"""
77
88from __future__ import annotations
1616class ExcelDDLCompiler (compiler .DDLCompiler ):
1717 """Compiles DDL statements for excel-dbapi."""
1818
19+ def _format_alter_table_name (self , operation : Any ) -> str :
20+ schema = getattr (operation , "schema" , None )
21+ if schema is not None :
22+ raise exc .CompileError ("Excel dialect does not support schemas" )
23+
24+ table_name = getattr (operation , "table_name" , None )
25+ if table_name is None :
26+ table = getattr (operation , "table" , None )
27+ table_name = getattr (table , "name" , None )
28+
29+ if not isinstance (table_name , str ) or not table_name :
30+ raise exc .CompileError ("ALTER TABLE operation requires a table name" )
31+
32+ return self .preparer .quote (table_name )
33+
34+ def _format_alter_column_name (self , column_name : Any ) -> str :
35+ if not isinstance (column_name , str ) or not column_name :
36+ raise exc .CompileError ("ALTER TABLE operation requires a column name" )
37+ return self .preparer .quote (column_name )
38+
1939 def visit_create_table (self , create : Any , ** kw : Any ) -> str :
2040 """Compile CREATE TABLE into SQL that excel-dbapi's parser accepts.
2141
@@ -38,6 +58,46 @@ def visit_drop_table(self, drop: Any, **kw: Any) -> str:
3858 table_name = self .preparer .format_table (table )
3959 return f"DROP TABLE { table_name } "
4060
61+ def visit_add_column (self , create : Any , ** kw : Any ) -> str :
62+ table_name = self ._format_alter_table_name (create )
63+ column = getattr (create , "column" , None )
64+ if column is None :
65+ raise exc .CompileError ("ALTER TABLE ADD COLUMN requires a column" )
66+
67+ col_name = self .preparer .format_column (column )
68+ col_type = self .dialect .type_compiler .process (column .type )
69+ return f"ALTER TABLE { table_name } ADD COLUMN { col_name } { col_type } "
70+
71+ def visit_drop_column (self , drop : Any , ** kw : Any ) -> str :
72+ table_name = self ._format_alter_table_name (drop )
73+
74+ column_name = getattr (drop , "column_name" , None )
75+ if column_name is None :
76+ column = getattr (drop , "column" , None )
77+ column_name = getattr (column , "name" , column )
78+
79+ column_name = self ._format_alter_column_name (column_name )
80+ return f"ALTER TABLE { table_name } DROP COLUMN { column_name } "
81+
82+ def visit_rename_column (self , rename : Any , ** kw : Any ) -> str :
83+ table_name = self ._format_alter_table_name (rename )
84+
85+ old_column_name = getattr (rename , "column_name" , None )
86+ if old_column_name is None :
87+ old_column_name = getattr (rename , "old_column_name" , None )
88+ if old_column_name is None :
89+ old_column_name = getattr (rename , "old_name" , None )
90+
91+ new_column_name = getattr (rename , "new_column_name" , None )
92+ if new_column_name is None :
93+ new_column_name = getattr (rename , "name" , None )
94+ if new_column_name is None :
95+ new_column_name = getattr (rename , "new_name" , None )
96+
97+ old_name = self ._format_alter_column_name (old_column_name )
98+ new_name = self ._format_alter_column_name (new_column_name )
99+ return f"ALTER TABLE { table_name } RENAME COLUMN { old_name } TO { new_name } "
100+
41101 def visit_create_index (
42102 self ,
43103 create : Any ,
0 commit comments