@@ -306,13 +306,13 @@ def compile(self, c: Compiler) -> str:
306306 return "." .join (map (c .quote , path ))
307307
308308 # Statement shorthands
309+ def create (self , source_table : ITable = None , * , if_not_exists = False , primary_keys = None ):
309310
310- def create (self , source_table : ITable = None , * , if_not_exists = False ):
311311 if source_table is None and not self .schema :
312312 raise ValueError ("Either schema or source table needed to create table" )
313313 if isinstance (source_table , TablePath ):
314314 source_table = source_table .select ()
315- return CreateTable (self , source_table , if_not_exists = if_not_exists )
315+ return CreateTable (self , source_table , if_not_exists = if_not_exists , primary_keys = primary_keys )
316316
317317 def drop (self , if_exists = False ):
318318 return DropTable (self , if_exists = if_exists )
@@ -641,14 +641,20 @@ class CreateTable(Statement):
641641 path : TablePath
642642 source_table : Expr = None
643643 if_not_exists : bool = False
644+ primary_keys : List [str ] = None
644645
645646 def compile (self , c : Compiler ) -> str :
646647 ne = "IF NOT EXISTS " if self .if_not_exists else ""
647648 if self .source_table :
648649 return f"CREATE TABLE { ne } { c .compile (self .path )} AS { c .compile (self .source_table )} "
649650
650- schema = ", " .join (f"{ c .quote (k )} { c .database .type_repr (v )} " for k , v in self .path .schema .items ())
651- return f"CREATE TABLE { ne } { c .compile (self .path )} ({ schema } )"
651+ schema = ", " .join (f"{ c .database .quote (k )} { c .database .type_repr (v )} " for k , v in self .path .schema .items ())
652+ pks = (
653+ ", PRIMARY KEY (%s)" % ", " .join (self .primary_keys )
654+ if self .primary_keys and c .database .SUPPORTS_PRIMARY_KEY
655+ else ""
656+ )
657+ return f"CREATE TABLE { ne } { c .compile (self .path )} ({ schema } { pks } )"
652658
653659
654660@dataclass
0 commit comments