@@ -103,8 +103,8 @@ class Compiler(object):
103103 "char" : "str" , "varchar" : "str" , "nchar" : "str" , "text" : "str" , "mediumtext" : "str" , "tinytext" : "str" ,
104104 "bigint" : "int" , "mediumint" : "int" , "smallint" : "int" , "tinyint" : "int" , "decimal" : "decimal" , "double" : "float" ,
105105 "boolean" : "bool" , "binary" : "bytes" , "varbinary" : "bytes" , "blob" : "bytes" , "timestamp" : "datetime" }
106- PRIMARY_TABLE = {"db" : None , "name" : None , "table_name" : None , "table_alias" : None , "seted_primary_keys " : False ,
107- "loader_primary_keys" : [], "outputer_primary_keys" : [], "alias_primary_keys" : [],
106+ PRIMARY_TABLE = {"db" : None , "name" : None , "table_name" : None , "table_alias" : None , "primary_keys " : [] ,
107+ "seted_primary_keys_type" : 0 , " loader_primary_keys" : [], "outputer_primary_keys" : [], "alias_primary_keys" : [],
108108 "columns" : {}, "subquery" : None , "select_columns" : {}}
109109
110110 def __init__ (self , config , env_variables , name ):
@@ -211,7 +211,8 @@ def compile_delete(self, expression, arguments):
211211 if where_calculate_expression is not None :
212212 raise SyncanySqlCompileException ('unknown where expression, related sql "%s"' % self .to_sql (expression ))
213213 self .parse_condition_typing_filter (expression , config , arguments )
214- config ["output" ] = "" .join (["&." , table_info ["db" ], "." , table_info ["name" ], "::id use DI" ])
214+ config ["output" ] = "" .join (["&." , table_info ["db" ], "." , table_info ["name" ], "::" ,
215+ "" .join (table_info ["primary_keys" ]) if table_info .get ("primary_keys" ) else "-" , " use DI" ])
215216 return config
216217
217218 def compile_query (self , expression , arguments ):
@@ -464,6 +465,7 @@ def compile_select(self, expression, config, arguments):
464465 primary_table ["name" ] = table_info ["name" ]
465466 primary_table ["table_alias" ] = table_info ["table_alias" ]
466467 primary_table ["table_name" ] = table_info ["table_name" ]
468+ primary_table ["primary_keys" ] = table_info ["primary_keys" ]
467469 elif isinstance (from_expression , sqlglot_expressions .Subquery ):
468470 if "alias" not in from_expression .args :
469471 raise SyncanySqlCompileException ('error subquery, must have an alias name, related sql "%s"'
@@ -733,12 +735,17 @@ def compile_select_column(self, expression, config, arguments, primary_table, co
733735 if not column_info ["column_name" ].isidentifier () or not column_alias .isidentifier ():
734736 return None
735737 if "pk" in column_info ["typing_options" ]:
736- if not primary_table ["seted_primary_keys" ] :
737- primary_table ["loader_primary_keys" ], primary_table ["outputer_primary_keys" ], primary_table ["seted_primary_keys " ] = [], [], True
738+ if primary_table ["seted_primary_keys_type" ] < 2 :
739+ primary_table ["loader_primary_keys" ], primary_table ["outputer_primary_keys" ], primary_table ["seted_primary_keys_type " ] = [], [], 2
738740 primary_table ["loader_primary_keys" ].append (column_info ["column_name" ])
739741 primary_table ["outputer_primary_keys" ].append (column_alias )
740- elif not primary_table ["seted_primary_keys" ] and not primary_table ["loader_primary_keys" ]:
741- if not column_info ["table_name" ] or column_info ["table_name" ] == primary_table ["table_name" ]:
742+ elif primary_table ["seted_primary_keys_type" ] < 2 and not column_info ["table_name" ] or column_info ["table_name" ] == primary_table ["table_name" ]:
743+ if column_info ["column_name" ] in primary_table ["primary_keys" ]:
744+ if primary_table ["seted_primary_keys_type" ] < 1 :
745+ primary_table ["loader_primary_keys" ], primary_table ["outputer_primary_keys" ], primary_table ["seted_primary_keys_type" ] = [], [], 1
746+ primary_table ["loader_primary_keys" ].append (column_info ["column_name" ])
747+ primary_table ["outputer_primary_keys" ].append (column_alias )
748+ elif not primary_table ["loader_primary_keys" ]:
742749 primary_table ["loader_primary_keys" ] = [column_info ["column_name" ]]
743750 if not primary_table ["outputer_primary_keys" ]:
744751 primary_table ["outputer_primary_keys" ] = [column_alias ]
@@ -765,7 +772,7 @@ def compile_select_calculate_column(self, expression, config, arguments, primary
765772 else :
766773 config ["schema" ][column_alias ] = self .compile_calculate (expression , config , arguments , primary_table , [])
767774 primary_table ["select_columns" ][column_alias ] = expression
768- if parse_primary_key and not primary_table ["seted_primary_keys " ] and not primary_table ["outputer_primary_keys" ] and column_alias .isidentifier ():
775+ if parse_primary_key and not primary_table ["seted_primary_keys_type " ] and not primary_table ["outputer_primary_keys" ] and column_alias .isidentifier ():
769776 loader_primary_keys = [calculate_field ["column_name" ] for calculate_field in calculate_fields
770777 if calculate_field ["column_name" ].isidentifier () and
771778 (not calculate_field ["table_name" ] or calculate_field ["table_name" ] == primary_table ["table_name" ])]
@@ -2694,6 +2701,7 @@ def parse(expression):
26942701 "table_alias" : table_alias ,
26952702 "origin_name" : origin_name ,
26962703 "typing_options" : typing_options ,
2704+ "primary_keys" : [],
26972705 }
26982706
26992707 def parse_column (self , expression , config , arguments , primary_table ):
@@ -3244,6 +3252,8 @@ def optimize_rewrite_update(self, expression, config, arguments):
32443252 continue
32453253 set_expressions .append ({"column" : column , "expression" : set_expression .args ["expression" ]})
32463254
3255+ if not primary_keys :
3256+ primary_keys = primary_table .get ("primary_keys" )
32473257 if not primary_keys :
32483258 raise SyncanySqlCompileException ('unknown primary key, related sql "%s"' % self .to_sql (expression ))
32493259 sql = ["INSERT INTO" ]
0 commit comments