|
1 | 1 | """Data Manipulation Language for Postgresql.""" |
2 | 2 |
|
| 3 | +import warnings |
| 4 | + |
3 | 5 | from foil.iteration import chunks |
4 | 6 | from psycopg2.extras import NamedTupleCursor |
5 | 7 |
|
@@ -83,32 +85,36 @@ def format_upsert_expert(insert_template, column_names, constraint, clause='', |
83 | 85 |
|
84 | 86 | constraint_str = ', '.join(constraint) |
85 | 87 | non_key_columns = [column for column in column_names if column not in constraint] |
86 | | - non_key_column_str = ', '.join(non_key_columns) |
87 | | - excluded_str = ', '.join('EXCLUDED.' + column for column in non_key_columns) |
| 88 | + |
| 89 | + if non_key_columns: |
| 90 | + non_key_column_str = ', '.join(non_key_columns) |
| 91 | + excluded_str = ', '.join('EXCLUDED.' + column for column in non_key_columns) |
| 92 | + action = ( |
| 93 | + ' DO UPDATE' |
| 94 | + ' SET ({non_key_columns}) = ({excluded})' |
| 95 | + ' {clause}').format(non_key_columns=non_key_column_str, |
| 96 | + excluded=excluded_str, clause=clause, |
| 97 | + table_alias=table_alias) |
| 98 | + else: |
| 99 | + action = ' DO NOTHING' |
88 | 100 |
|
89 | 101 | statement = ( |
90 | 102 | '{insert_template}' |
91 | 103 | ' ON CONFLICT ({constraint})' |
92 | | - ' DO UPDATE' |
93 | | - ' SET ({non_key_columns}) = ({excluded})' |
94 | | - ' {clause};').format(insert_template=insert_template, |
95 | | - constraint=constraint_str, |
96 | | - non_key_columns=non_key_column_str, |
97 | | - excluded=excluded_str, clause=clause, |
98 | | - table_alias=table_alias) |
| 104 | + '{action}').format(insert_template=insert_template, |
| 105 | + constraint=constraint_str, |
| 106 | + action=action) |
| 107 | + |
99 | 108 | return statement |
100 | 109 |
|
101 | 110 |
|
102 | 111 | def format_upsert_primary_key(qualified_name, column_names, primary_key_names, |
103 | 112 | param_style=PYFORMAT): |
| 113 | + warning = 'Deprecation Warning. Function will be removed as of version 0.1.0.' |
| 114 | + warnings.warn(warning, DeprecationWarning) |
104 | 115 |
|
105 | | - if column_names != primary_key_names: |
106 | | - query = format_upsert(qualified_name, column_names, primary_key_names, |
107 | | - param_style=param_style) |
108 | | - else: |
109 | | - # Note: When upsert columns are all primary keys, it's an insert. |
110 | | - query = create_insert_statement(qualified_name, column_names, |
111 | | - param_style=param_style) |
| 116 | + query = format_upsert(qualified_name, column_names, primary_key_names, |
| 117 | + param_style=param_style) |
112 | 118 |
|
113 | 119 | return query |
114 | 120 |
|
@@ -148,7 +154,7 @@ def __call__(self, conn, records, chunksize=2500): |
148 | 154 | class UpsertPrimaryKey: |
149 | 155 | def __init__(self, qualified_name, column_names, primary_key_names): |
150 | 156 |
|
151 | | - self.query = format_upsert_primary_key( |
| 157 | + self.query = format_upsert( |
152 | 158 | qualified_name, column_names, primary_key_names |
153 | 159 | ) |
154 | 160 |
|
@@ -202,16 +208,12 @@ class CopyFromUpsert(BulkDmlPrimaryKey): |
202 | 208 | ) |
203 | 209 |
|
204 | 210 | def make_dml_query(self): |
205 | | - # Note: When upsert columns are all primary keys, it's an insert. |
206 | 211 | query = self._INSERT_TEMPLATE.format( |
207 | 212 | table=self.table.qualified_name, columns=self.column_str, |
208 | 213 | temp_table=self.copy_table.name |
209 | 214 | ) |
210 | | - |
211 | | - if self.table.column_names != self.table.primary_key_columns: |
212 | | - query = format_upsert_expert(query, |
213 | | - self.table.column_names, |
214 | | - self.table.primary_key_columns) |
| 215 | + query = format_upsert_expert(query, self.table.column_names, |
| 216 | + self.table.primary_key_columns) |
215 | 217 |
|
216 | 218 | return query |
217 | 219 |
|
|
0 commit comments