velocity-python 0.0.30__py3-none-any.whl → 0.0.32__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of velocity-python might be problematic. Click here for more details.

@@ -4,95 +4,102 @@ import decimal
4
4
  import datetime
5
5
  from velocity.db import exceptions
6
6
 
7
+
7
8
  def initialize(config):
8
9
  from velocity.db.core.engine import Engine
9
10
  import mysql.connector
11
+
10
12
  return Engine(mysql.connector, config, SQL)
11
13
 
14
+
12
15
  def make_where(where, sql, vals, is_join=False):
13
16
  if not where:
14
17
  return
15
- sql.append('WHERE')
18
+ sql.append("WHERE")
16
19
  if isinstance(where, str):
17
20
  sql.append(where)
18
21
  return
19
- if isinstance(where,dict):
22
+ if isinstance(where, dict):
20
23
  where = where.items()
21
- if isinstance(where,list):
22
- join = ''
23
- for key,val in where:
24
- if join: sql.append(join)
24
+ if isinstance(where, list):
25
+ join = ""
26
+ for key, val in where:
27
+ if join:
28
+ sql.append(join)
25
29
  if is_join:
26
- if '.' not in key:
27
- key = 'A.' + key
30
+ if "." not in key:
31
+ key = "A." + key
28
32
  if val == None:
29
- if '!' in key:
30
- key = key.replace('!','')
31
- sql.append('{} is not NULL'.format(quote(key.lower())))
33
+ if "!" in key:
34
+ key = key.replace("!", "")
35
+ sql.append("{} is not NULL".format(quote(key.lower())))
32
36
  else:
33
- sql.append('{} is NULL'.format(quote(key.lower())))
34
- elif isinstance(val,(list,tuple)):
35
- if '!' in key:
36
- key = key.replace('!','')
37
- sql.append('{} not in %s'.format(quote(key.lower())))
37
+ sql.append("{} is NULL".format(quote(key.lower())))
38
+ elif isinstance(val, (list, tuple)):
39
+ if "!" in key:
40
+ key = key.replace("!", "")
41
+ sql.append("{} not in %s".format(quote(key.lower())))
38
42
  vals.append(tuple(val))
39
43
  else:
40
- sql.append('{} in %s'.format(quote(key.lower())))
44
+ sql.append("{} in %s".format(quote(key.lower())))
41
45
  vals.append(tuple(val))
42
46
  else:
43
- if '<>' in key:
44
- key = key.replace('<>','')
45
- op = '<>'
46
- elif '!=' in key:
47
- key = key.replace('!=','')
48
- op = '<>'
49
- elif '!%' in key:
50
- key = key.replace('!%','')
51
- op = 'not like'
52
- elif '%%' in key:
53
- key = key.replace('%%','')
54
- op = '%'
55
- elif '%>' in key:
56
- key = key.replace('%>','')
57
- op = '%>'
58
- elif '<%' in key:
59
- key = key.replace('<%','')
60
- op = '<%'
61
- elif '==' in key:
62
- key = key.replace('==','')
63
- op = '='
64
- elif '<=' in key:
65
- key = key.replace('<=','')
66
- op = '<='
67
- elif '>=' in key:
68
- key = key.replace('>=','')
69
- op = '>='
70
- elif '<' in key:
71
- key = key.replace('<','')
72
- op = '<'
73
- elif '>' in key:
74
- key = key.replace('>','')
75
- op = '>'
76
- elif '%' in key:
77
- key = key.replace('%','')
78
- op = 'like'
79
- elif '!' in key:
80
- key = key.replace('!','')
81
- op = '<>'
82
- elif '=' in key:
83
- key = key.replace('=','')
84
- op = '='
47
+ if "<>" in key:
48
+ key = key.replace("<>", "")
49
+ op = "<>"
50
+ elif "!=" in key:
51
+ key = key.replace("!=", "")
52
+ op = "<>"
53
+ elif "!%" in key:
54
+ key = key.replace("!%", "")
55
+ op = "not like"
56
+ elif "%%" in key:
57
+ key = key.replace("%%", "")
58
+ op = "%"
59
+ elif "%>" in key:
60
+ key = key.replace("%>", "")
61
+ op = "%>"
62
+ elif "<%" in key:
63
+ key = key.replace("<%", "")
64
+ op = "<%"
65
+ elif "==" in key:
66
+ key = key.replace("==", "")
67
+ op = "="
68
+ elif "<=" in key:
69
+ key = key.replace("<=", "")
70
+ op = "<="
71
+ elif ">=" in key:
72
+ key = key.replace(">=", "")
73
+ op = ">="
74
+ elif "<" in key:
75
+ key = key.replace("<", "")
76
+ op = "<"
77
+ elif ">" in key:
78
+ key = key.replace(">", "")
79
+ op = ">"
80
+ elif "%" in key:
81
+ key = key.replace("%", "")
82
+ op = "like"
83
+ elif "!" in key:
84
+ key = key.replace("!", "")
85
+ op = "<>"
86
+ elif "=" in key:
87
+ key = key.replace("=", "")
88
+ op = "="
85
89
  else:
86
- op = '='
87
- if isinstance(val,str) and val[:2] == '@@':
88
- sql.append('{} {} {}'.format(quote(key.lower()), op, val[2:]))
90
+ op = "="
91
+ if isinstance(val, str) and val[:2] == "@@":
92
+ sql.append("{} {} {}".format(quote(key.lower()), op, val[2:]))
89
93
  else:
90
- if 'like' in op:
91
- sql.append('lower({}) {} lower(%s)'.format(quote(key.lower()), op))
94
+ if "like" in op:
95
+ sql.append(
96
+ "lower({}) {} lower(%s)".format(quote(key.lower()), op)
97
+ )
92
98
  else:
93
- sql.append('{} {} %s'.format(quote(key.lower()), op))
99
+ sql.append("{} {} %s".format(quote(key.lower()), op))
94
100
  vals.append(val)
95
- join = 'AND'
101
+ join = "AND"
102
+
96
103
 
97
104
  def quote(data):
98
105
  if isinstance(data, list):
@@ -101,81 +108,94 @@ def quote(data):
101
108
  new.append(quote(item))
102
109
  return new
103
110
  else:
104
- parts = data.split('.')
111
+ parts = data.split(".")
105
112
  new = []
106
113
  for part in parts:
107
- if '`' in part:
114
+ if "`" in part:
108
115
  new.append(part)
109
116
  elif part.upper() in reserved_words:
110
- new.append('`'+part+'`')
111
- elif re.findall('[/]',part):
112
- new.append('`'+part+'`')
117
+ new.append("`" + part + "`")
118
+ elif re.findall("[/]", part):
119
+ new.append("`" + part + "`")
113
120
  else:
114
121
  new.append(part)
115
- return '.'.join(new)
122
+ return ".".join(new)
123
+
116
124
 
117
125
  class SQL:
118
126
  server = "MySQL"
119
- type_column_identifier = 'DATA_TYPE'
120
- is_nullable = 'IS_NULLABLE'
127
+ type_column_identifier = "DATA_TYPE"
128
+ is_nullable = "IS_NULLABLE"
121
129
 
122
- default_schema = 'mydb'
130
+ default_schema = "mydb"
123
131
 
124
132
  ApplicationErrorCodes = []
125
133
 
126
134
  DatabaseMissingErrorCodes = []
127
135
  TableMissingErrorCodes = [1146]
128
136
  ColumnMissingErrorCodes = [1054]
129
- ForeignKeyMissingErrorCodes =[]
137
+ ForeignKeyMissingErrorCodes = []
130
138
 
131
139
  ConnectionErrorCodes = []
132
- DuplicateKeyErrorCodes = [] # Handled in regex check.
140
+ DuplicateKeyErrorCodes = [] # Handled in regex check.
133
141
  RetryTransactionCodes = []
134
142
  TruncationErrorCodes = []
135
143
  LockTimeoutErrorCodes = []
136
144
  DatabaseObjectExistsErrorCodes = []
137
145
 
138
146
  @classmethod
139
- def __has_pointer(cls,columns):
147
+ def __has_pointer(cls, columns):
140
148
  if columns:
141
- if isinstance(columns,list):
142
- columns = ','.join(columns)
143
- if '>' in columns:
149
+ if isinstance(columns, list):
150
+ columns = ",".join(columns)
151
+ if ">" in columns:
144
152
  return True
145
153
  return False
146
154
 
147
155
  @classmethod
148
156
  def alter_add(cls, table, columns, null_allowed=True):
149
157
  sql = []
150
- null = 'NOT NULL' if not null_allowed else ''
151
- if isinstance(columns,dict):
152
- for key,val in columns.items():
153
- key = re.sub('<>!=%', '', key.lower())
154
- sql.append("ALTER TABLE {} ADD {} {} {};".format(quote(table), quote(key), cls.get_type(val), null))
155
- return '\n\t'.join(sql), tuple()
158
+ null = "NOT NULL" if not null_allowed else ""
159
+ if isinstance(columns, dict):
160
+ for key, val in columns.items():
161
+ key = re.sub("<>!=%", "", key.lower())
162
+ sql.append(
163
+ "ALTER TABLE {} ADD {} {} {};".format(
164
+ quote(table), quote(key), cls.get_type(val), null
165
+ )
166
+ )
167
+ return "\n\t".join(sql), tuple()
156
168
 
157
169
  @classmethod
158
170
  def columns(cls, name):
159
- if '.' in name:
171
+ if "." in name:
160
172
  return """
161
173
  SELECT COLUMN_NAME
162
174
  FROM INFORMATION_SCHEMA.columns
163
175
  WHERE TABLE_SCHEMA = %s
164
176
  AND TABLE_NAME = %s
165
- """, tuple(name.split('.'))
177
+ """, tuple(
178
+ name.split(".")
179
+ )
166
180
  else:
167
181
  return """
168
182
  SELECT COLUMN_NAME
169
183
  FROM INFORMATION_SCHEMA.columns
170
184
  WHERE TABLE_SCHEMA = %s
171
- """, tuple([name,])
185
+ """, tuple(
186
+ [
187
+ name,
188
+ ]
189
+ )
172
190
 
173
191
  @classmethod
174
- def create_foreign_key(cls, table, columns, key_to_table, key_to_columns, name=None, schema=None):
175
- if '.' not in table and schema:
192
+ def create_foreign_key(
193
+ cls, table, columns, key_to_table, key_to_columns, name=None, schema=None
194
+ ):
195
+ if "." not in table and schema:
176
196
  if schema == None:
177
197
  schema = cls.default_schema
178
- table = "{}.{}".format(schema,table)
198
+ table = "{}.{}".format(schema, table)
179
199
  if isinstance(key_to_columns, str):
180
200
  key_to_columns = [key_to_columns]
181
201
  if isinstance(columns, str):
@@ -183,75 +203,97 @@ class SQL:
183
203
  if not name:
184
204
  m = hashlib.md5()
185
205
  m.update(table)
186
- m.update(' '.join(columns))
206
+ m.update(" ".join(columns))
187
207
  m.update(key_to_table)
188
- m.update(' ' .join(key_to_columns))
189
- name = 'FK_' + m.hexdigest()
190
- sql = "ALTER TABLE {} ADD CONSTRAINT {} FOREIGN KEY ({}) REFERENCES {} ({}) ON DELETE CASCADE ON UPDATE CASCADE;".format(table, name, ','.join(columns), key_to_table, ','.join(key_to_columns))
208
+ m.update(" ".join(key_to_columns))
209
+ name = "FK_" + m.hexdigest()
210
+ sql = "ALTER TABLE {} ADD CONSTRAINT {} FOREIGN KEY ({}) REFERENCES {} ({}) ON DELETE CASCADE ON UPDATE CASCADE;".format(
211
+ table, name, ",".join(columns), key_to_table, ",".join(key_to_columns)
212
+ )
191
213
 
192
214
  return sql, tuple()
193
215
 
194
216
  @classmethod
195
- def create_index(cls, table=None, columns=None, unique=False, direction=None, where=None, name=None, schema=None, trigram=None, tbl=None):
196
- if '.' not in table and schema:
197
- table = "{}.{}".format(schema,table)
198
- if isinstance(columns,(list,set)):
199
- columns = ','.join([quote(c.lower()) for c in sorted(columns)])
217
+ def create_index(
218
+ cls,
219
+ table=None,
220
+ columns=None,
221
+ unique=False,
222
+ direction=None,
223
+ where=None,
224
+ name=None,
225
+ schema=None,
226
+ trigram=None,
227
+ tbl=None,
228
+ ):
229
+ if "." not in table and schema:
230
+ table = "{}.{}".format(schema, table)
231
+ if isinstance(columns, (list, set)):
232
+ columns = ",".join([quote(c.lower()) for c in sorted(columns)])
200
233
  else:
201
234
  columns = quote(columns)
202
- sql = ['CREATE']
235
+ sql = ["CREATE"]
203
236
  if unique:
204
- sql.append('UNIQUE')
205
- sql.append('INDEX')
237
+ sql.append("UNIQUE")
238
+ sql.append("INDEX")
206
239
  tablename = quote(table)
207
240
  if not name:
208
- name = re.sub(r'\([^)]*\)', '', columns.replace(',','_'))
209
- sql.append('IDX__{}__{}'.format(table.replace('.','_'),name))
210
- sql.append('ON')
241
+ name = re.sub(r"\([^)]*\)", "", columns.replace(",", "_"))
242
+ sql.append("IDX__{}__{}".format(table.replace(".", "_"), name))
243
+ sql.append("ON")
211
244
  sql.append(tablename)
212
- sql.append('(')
245
+ sql.append("(")
213
246
  sql.append(columns)
214
- sql.append(')')
215
- return ' '.join(sql), tuple()
247
+ sql.append(")")
248
+ return " ".join(sql), tuple()
216
249
 
217
250
  @classmethod
218
251
  def create_table(cls, name, columns={}, drop=False):
219
- trigger = ''.format(name)
252
+ trigger = "".format(name)
220
253
  sql = []
221
254
  if drop:
222
255
  sql.append(cls.drop_table(name))
223
- sql.append("""
256
+ sql.append(
257
+ """
224
258
  CREATE TABLE {0} (
225
259
  sys_id SERIAL PRIMARY KEY AUTO_INCREMENT,
226
260
  sys_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
227
261
  sys_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
228
262
  )ENGINE=InnoDB AUTO_INCREMENT=1000;
229
- """.format(quote(name)))
230
-
231
- for key,val in columns.items():
232
- key = re.sub('<>!=%', '', key.lower())
233
- if key in ['sys_id','sys_created','sys_modified']:
263
+ """.format(
264
+ quote(name)
265
+ )
266
+ )
267
+
268
+ for key, val in columns.items():
269
+ key = re.sub("<>!=%", "", key.lower())
270
+ if key in ["sys_id", "sys_created", "sys_modified"]:
234
271
  continue
235
- sql.append("ALTER TABLE {} ADD COLUMN {} {};".format(quote(name),quote(key),cls.get_type(val)))
236
- return '\n\t'.join(sql), tuple()
272
+ sql.append(
273
+ "ALTER TABLE {} ADD COLUMN {} {};".format(
274
+ quote(name), quote(key), cls.get_type(val)
275
+ )
276
+ )
277
+ return "\n\t".join(sql), tuple()
237
278
 
238
279
  @classmethod
239
280
  def delete(cls, table, where):
240
- sql = ['DELETE FROM {}'.format(table)]
281
+ sql = ["DELETE FROM {}".format(table)]
241
282
  vals = []
242
283
  make_where(where, sql, vals)
243
- return ' '.join(sql), tuple(vals)
284
+ return " ".join(sql), tuple(vals)
244
285
 
245
286
  @classmethod
246
287
  def drop_table(cls, name):
247
288
  return "DROP TABLE IF EXISTS %s CASCADE;" % quote(name), tuple()
248
289
 
249
290
  @classmethod
250
- def foreign_key_info(cls,table=None,column=None,schema=None):
251
- if '.' in table:
252
- schema, table = table.split('.')
291
+ def foreign_key_info(cls, table=None, column=None, schema=None):
292
+ if "." in table:
293
+ schema, table = table.split(".")
253
294
 
254
- sql = ["""
295
+ sql = [
296
+ """
255
297
  SELECT
256
298
  TABLE_NAME AS FK_TABLE_NAME
257
299
  ,COLUMN_NAME AS FK_COLUMN_NAME
@@ -260,58 +302,48 @@ class SQL:
260
302
  ,REFERENCED_COLUMN_NAME
261
303
  FROM
262
304
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
263
- """]
305
+ """
306
+ ]
264
307
  vals = []
265
308
  where = {}
266
309
  if schema:
267
- where['LOWER(REFERENCED_TABLE_SCHEMA)'] = schema.lower()
310
+ where["LOWER(REFERENCED_TABLE_SCHEMA)"] = schema.lower()
268
311
  if table:
269
- where['LOWER(REFERENCED_TABLE_NAME)'] = table.lower()
312
+ where["LOWER(REFERENCED_TABLE_NAME)"] = table.lower()
270
313
  if column:
271
- where['LOWER(REFERENCED_COLUMN_NAME)'] = column.lower()
314
+ where["LOWER(REFERENCED_COLUMN_NAME)"] = column.lower()
272
315
  make_where(where, sql, vals)
273
- return ' '.join(sql), tuple(vals)
316
+ return " ".join(sql), tuple(vals)
274
317
 
275
318
  @classmethod
276
319
  def get_type(cls, v):
277
320
  if isinstance(v, str):
278
- if v[:2] == '@@':
321
+ if v[:2] == "@@":
279
322
  return v[2:] or cls.TYPES.TEXT
280
- elif isinstance(v, (str, bytes)) \
281
- or v is str \
282
- or v is bytes:
283
- return cls.TYPES.TEXT
284
- elif isinstance(v, bool) \
285
- or v is bool:
323
+ elif isinstance(v, (str, bytes)) or v is str or v is bytes:
324
+ return cls.TYPES.TEXT
325
+ elif isinstance(v, bool) or v is bool:
286
326
  return cls.TYPES.BOOLEAN
287
- elif isinstance(v, int) \
288
- or v is int:
327
+ elif isinstance(v, int) or v is int:
289
328
  if v is int:
290
329
  return cls.TYPES.INTEGER
291
330
  if v > 2147483647 or v < -2147483648:
292
331
  return cls.TYPES.BIGINT
293
332
  else:
294
- return cls.TYPES.INTEGER
295
- elif isinstance(v, float) \
296
- or v is float:
297
- return cls.TYPES.NUMERIC + '(19, 6)'
298
- elif isinstance(v, decimal.Decimal) \
299
- or v is decimal.Decimal:
300
- return cls.TYPES.NUMERIC + '(19, 6)'
301
- elif isinstance (v, datetime.datetime) \
302
- or v is datetime.datetime:
333
+ return cls.TYPES.INTEGER
334
+ elif isinstance(v, float) or v is float:
335
+ return cls.TYPES.NUMERIC + "(19, 6)"
336
+ elif isinstance(v, decimal.Decimal) or v is decimal.Decimal:
337
+ return cls.TYPES.NUMERIC + "(19, 6)"
338
+ elif isinstance(v, datetime.datetime) or v is datetime.datetime:
303
339
  return cls.TYPES.DATETIME
304
- elif isinstance (v, datetime.date) \
305
- or v is datetime.date:
340
+ elif isinstance(v, datetime.date) or v is datetime.date:
306
341
  return cls.TYPES.DATE
307
- elif isinstance(v, datetime.time) \
308
- or v is datetime.time:
342
+ elif isinstance(v, datetime.time) or v is datetime.time:
309
343
  return cls.TYPES.TIME
310
- elif isinstance(v, datetime.timedelta) \
311
- or v is datetime.timedelta:
344
+ elif isinstance(v, datetime.timedelta) or v is datetime.timedelta:
312
345
  return cls.TYPES.INTERVAL
313
- elif isinstance (v, bytearray) \
314
- or v is bytearray:
346
+ elif isinstance(v, bytearray) or v is bytearray:
315
347
  return cls.TYPES.BINARY
316
348
  # Everything else defaults to TEXT, incl. None
317
349
  return cls.TYPES.TEXT
@@ -321,31 +353,29 @@ class SQL:
321
353
  keys = []
322
354
  vals = []
323
355
  args = []
324
- for key,val in data.items():
356
+ for key, val in data.items():
325
357
  keys.append(quote(key.lower()))
326
- if isinstance(val,str) \
327
- and len(val) > 2 \
328
- and val[:2] == '@@':
358
+ if isinstance(val, str) and len(val) > 2 and val[:2] == "@@":
329
359
  vals.append(val[2:])
330
360
  else:
331
- vals.append('%s')
361
+ vals.append("%s")
332
362
  args.append(val)
333
363
 
334
- sql = ['INSERT INTO']
364
+ sql = ["INSERT INTO"]
335
365
  sql.append(quote(table))
336
- sql.append('(')
337
- sql.append(','.join(keys))
338
- sql.append(')')
339
- sql.append('VALUES')
340
- sql.append('(')
341
- sql.append(','.join(vals))
342
- sql.append(')')
343
- sql = ' '.join(sql)
366
+ sql.append("(")
367
+ sql.append(",".join(keys))
368
+ sql.append(")")
369
+ sql.append("VALUES")
370
+ sql.append("(")
371
+ sql.append(",".join(vals))
372
+ sql.append(")")
373
+ sql = " ".join(sql)
344
374
  return sql, tuple(args)
345
375
 
346
376
  @classmethod
347
377
  def last_id(cls, table):
348
- return "SELECT LAST_INSERT_ID();",tuple()
378
+ return "SELECT LAST_INSERT_ID();", tuple()
349
379
 
350
380
  @classmethod
351
381
  def create_savepoint(cls, sp):
@@ -361,215 +391,483 @@ class SQL:
361
391
 
362
392
  @classmethod
363
393
  def create_view(cls, name, query, temp=False, silent=True):
364
- sql = ['CREATE']
394
+ sql = ["CREATE"]
365
395
  if silent:
366
- sql.append('OR REPLACE')
396
+ sql.append("OR REPLACE")
367
397
  if temp:
368
- sql.append('TEMPORARY')
369
- sql.append('VIEW')
398
+ sql.append("TEMPORARY")
399
+ sql.append("VIEW")
370
400
  sql.append(name)
371
- sql.append('AS')
401
+ sql.append("AS")
372
402
  sql.append(query)
373
- return ' '.join(sql),tuple()
403
+ return " ".join(sql), tuple()
374
404
 
375
405
  @classmethod
376
406
  def drop_view(cls, name, silent=True):
377
- sql = ['DROP VIEW']
407
+ sql = ["DROP VIEW"]
378
408
  if silent:
379
- sql.append('IF EXISTS')
409
+ sql.append("IF EXISTS")
380
410
  sql.append(name)
381
- return ' '.join(sql),tuple()
411
+ return " ".join(sql), tuple()
382
412
 
383
413
  @classmethod
384
414
  def rename_column(cls, table, orig, new):
385
- return "ALTER TABLE {} RENAME COLUMN {} TO {};".format(quote(table), quote(orig), quote(new)), tuple()
415
+ return (
416
+ "ALTER TABLE {} RENAME COLUMN {} TO {};".format(
417
+ quote(table), quote(orig), quote(new)
418
+ ),
419
+ tuple(),
420
+ )
386
421
 
387
422
  @classmethod
388
- def select(cls,columns=None,table=None,where=None,orderby=None,groupby=None,having=None,start=None,qty=None,tbl=None):
423
+ def select(
424
+ cls,
425
+ columns=None,
426
+ table=None,
427
+ where=None,
428
+ orderby=None,
429
+ groupby=None,
430
+ having=None,
431
+ start=None,
432
+ qty=None,
433
+ tbl=None,
434
+ ):
389
435
  is_join = False
390
436
 
391
- if isinstance(columns,str)\
392
- and 'distinct' in columns.lower():
437
+ if isinstance(columns, str) and "distinct" in columns.lower():
393
438
  sql = [
394
- 'SELECT',
439
+ "SELECT",
395
440
  columns,
396
- 'FROM',
441
+ "FROM",
397
442
  quote(table),
398
- ]
443
+ ]
399
444
  elif cls.__has_pointer(columns):
400
445
  is_join = True
401
- if isinstance(columns,str):
402
- columns = columns.split(',')
446
+ if isinstance(columns, str):
447
+ columns = columns.split(",")
403
448
  letter = 65
404
449
  tables = {table: chr(letter)}
405
450
  letter += 1
406
451
  __select = []
407
- __from = ['{} AS {}'.format(quote(table),tables.get(table))]
452
+ __from = ["{} AS {}".format(quote(table), tables.get(table))]
408
453
  __left_join = []
409
454
 
410
455
  for column in columns:
411
- if '>' in column:
456
+ if ">" in column:
412
457
  is_join = True
413
- parts = column.split('>')
458
+ parts = column.split(">")
414
459
  foreign = tbl.foreign_key_info(parts[0])
415
460
  if not foreign:
416
461
  raise exceptions.DbApplicationError("Foreign key not defined")
417
- ref_table = foreign['referenced_table_name']
418
- ref_schema = foreign['referenced_table_schema']
419
- ref_column = foreign['referenced_column_name']
420
- lookup = "{}:{}".format(ref_table,parts[0])
462
+ ref_table = foreign["referenced_table_name"]
463
+ ref_schema = foreign["referenced_table_schema"]
464
+ ref_column = foreign["referenced_column_name"]
465
+ lookup = "{}:{}".format(ref_table, parts[0])
421
466
  if tables.has_key(lookup):
422
- __select.append('{}."{}" as "{}"'.format(tables.get(lookup),parts[1],'_'.join(parts)))
467
+ __select.append(
468
+ '{}."{}" as "{}"'.format(
469
+ tables.get(lookup), parts[1], "_".join(parts)
470
+ )
471
+ )
423
472
  else:
424
473
  tables[lookup] = chr(letter)
425
474
  letter += 1
426
- __select.append('{}."{}" as "{}"'.format(tables.get(lookup),parts[1],'_'.join(parts)))
427
- __left_join.append('LEFT OUTER JOIN "{}"."{}" AS {}'.format(ref_schema,ref_table,tables.get(lookup)))
428
- __left_join.append('ON {}."{}" = {}."{}"'.format(
429
- tables.get(table),
430
- parts[0],
431
- tables.get(lookup),
432
- ref_column
433
- ))
475
+ __select.append(
476
+ '{}."{}" as "{}"'.format(
477
+ tables.get(lookup), parts[1], "_".join(parts)
478
+ )
479
+ )
480
+ __left_join.append(
481
+ 'LEFT OUTER JOIN "{}"."{}" AS {}'.format(
482
+ ref_schema, ref_table, tables.get(lookup)
483
+ )
484
+ )
485
+ __left_join.append(
486
+ 'ON {}."{}" = {}."{}"'.format(
487
+ tables.get(table),
488
+ parts[0],
489
+ tables.get(lookup),
490
+ ref_column,
491
+ )
492
+ )
434
493
  if orderby and column in orderby:
435
- orderby = orderby.replace(column,"{}.{}".format(tables.get(lookup),parts[1]))
494
+ orderby = orderby.replace(
495
+ column, "{}.{}".format(tables.get(lookup), parts[1])
496
+ )
436
497
 
437
498
  else:
438
- if '(' in column:
499
+ if "(" in column:
439
500
  __select.append(column)
440
501
  else:
441
- __select.append("{}.{}".format(tables.get(table),column))
442
- sql = ['SELECT']
443
- sql.append(','.join(__select))
444
- sql.append('FROM')
502
+ __select.append("{}.{}".format(tables.get(table), column))
503
+ sql = ["SELECT"]
504
+ sql.append(",".join(__select))
505
+ sql.append("FROM")
445
506
  sql.extend(__from)
446
507
  sql.extend(__left_join)
447
508
  else:
448
509
  if columns:
449
- if isinstance(columns,str):
450
- columns = columns.split(',')
451
- if isinstance(columns,list):
510
+ if isinstance(columns, str):
511
+ columns = columns.split(",")
512
+ if isinstance(columns, list):
452
513
  columns = quote(columns)
453
- columns = ','.join(columns)
514
+ columns = ",".join(columns)
454
515
  else:
455
- columns = '*'
516
+ columns = "*"
456
517
  sql = [
457
- 'SELECT',
518
+ "SELECT",
458
519
  columns,
459
- 'FROM',
520
+ "FROM",
460
521
  quote(table),
461
- ]
522
+ ]
462
523
  vals = []
463
524
  make_where(where, sql, vals, is_join)
464
525
  if groupby:
465
- sql.append('GROUP BY')
466
- if isinstance(groupby,(list,tuple)):
467
- groupby = ','.join(groupby)
526
+ sql.append("GROUP BY")
527
+ if isinstance(groupby, (list, tuple)):
528
+ groupby = ",".join(groupby)
468
529
  sql.append(groupby)
469
530
  if having:
470
- sql.append('HAVING')
471
- if isinstance(having,(list,tuple)):
472
- having = ','.join(having)
531
+ sql.append("HAVING")
532
+ if isinstance(having, (list, tuple)):
533
+ having = ",".join(having)
473
534
  sql.append(having)
474
535
  if orderby:
475
- sql.append('ORDER BY')
476
- if isinstance(orderby,(list,tuple)):
477
- orderby = ','.join(orderby)
536
+ sql.append("ORDER BY")
537
+ if isinstance(orderby, (list, tuple)):
538
+ orderby = ",".join(orderby)
478
539
  sql.append(orderby)
479
540
  if start and qty:
480
- sql.append('OFFSET {} ROWS FETCH NEXT {} ROWS ONLY'.format(start,qty))
541
+ sql.append("OFFSET {} ROWS FETCH NEXT {} ROWS ONLY".format(start, qty))
481
542
  elif start:
482
- sql.append('OFFSET {} ROWS'.format(start))
543
+ sql.append("OFFSET {} ROWS".format(start))
483
544
  elif qty:
484
- sql.append('FETCH NEXT {} ROWS ONLY'.format(qty))
485
- sql = ' '.join(sql)
545
+ sql.append("FETCH NEXT {} ROWS ONLY".format(qty))
546
+ sql = " ".join(sql)
486
547
  return sql, tuple(vals)
487
548
 
488
549
  @classmethod
489
550
  def update(cls, table, data, pk):
490
- sql = ['UPDATE']
551
+ sql = ["UPDATE"]
491
552
  sql.append(quote(table))
492
- sql.append('SET')
553
+ sql.append("SET")
493
554
  vals = []
494
- join = ''
555
+ join = ""
495
556
  for key in data.keys():
496
557
  val = data[key]
497
558
  if join:
498
559
  sql.append(join)
499
- if isinstance(val,str) and val[:2] == '@@':
500
- sql.append("{} = {}".format(quote(key.lower()),val[2:]))
560
+ if isinstance(val, str) and val[:2] == "@@":
561
+ sql.append("{} = {}".format(quote(key.lower()), val[2:]))
501
562
  else:
502
- sql.append('{} = %s'.format(quote(key.lower())))
563
+ sql.append("{} = %s".format(quote(key.lower())))
503
564
  vals.append(val)
504
- join = ','
565
+ join = ","
505
566
  make_where(pk, sql, vals)
506
- return ' '.join(sql), tuple(vals)
567
+ return " ".join(sql), tuple(vals)
507
568
 
508
569
  @classmethod
509
570
  def upsert(cls, table, data, pk):
510
571
  keys = []
511
572
  vals = []
512
573
  args = []
513
- for key,val in data.items():
574
+ for key, val in data.items():
514
575
  keys.append(quote(key.lower()))
515
- if isinstance(val,str) \
516
- and len(val) > 2 \
517
- and val[:2] == '@@':
576
+ if isinstance(val, str) and len(val) > 2 and val[:2] == "@@":
518
577
  vals.append(val[2:])
519
578
  else:
520
- vals.append('%s')
579
+ vals.append("%s")
521
580
  args.append(val)
522
- for key,val in pk.items():
581
+ for key, val in pk.items():
523
582
  keys.append(quote(key.lower()))
524
- if isinstance(val,str) \
525
- and len(val) > 2 \
526
- and val[:2] == '@@':
583
+ if isinstance(val, str) and len(val) > 2 and val[:2] == "@@":
527
584
  vals.append(val[2:])
528
585
  else:
529
- vals.append('%s')
586
+ vals.append("%s")
530
587
  args.append(val)
531
- sql = ['INSERT INTO']
588
+ sql = ["INSERT INTO"]
532
589
  sql.append(quote(table))
533
- sql.append('(')
534
- sql.append(','.join(keys))
535
- sql.append(')')
536
- sql.append('VALUES')
537
- sql.append('(')
538
- sql.append(','.join(vals))
539
- sql.append(')')
540
- sql.append('ON DUPLICATE KEY UPDATE')
541
- join = ''
590
+ sql.append("(")
591
+ sql.append(",".join(keys))
592
+ sql.append(")")
593
+ sql.append("VALUES")
594
+ sql.append("(")
595
+ sql.append(",".join(vals))
596
+ sql.append(")")
597
+ sql.append("ON DUPLICATE KEY UPDATE")
598
+ join = ""
542
599
  for key in data.keys():
543
600
  val = data[key]
544
601
  if join:
545
602
  sql.append(join)
546
- if isinstance(val,str) and val[:2] == '@@':
547
- sql.append("{} = {}".format(quote(key.lower()),val[2:]))
603
+ if isinstance(val, str) and val[:2] == "@@":
604
+ sql.append("{} = {}".format(quote(key.lower()), val[2:]))
548
605
  else:
549
- sql.append('{} = %s'.format(quote(key.lower())))
606
+ sql.append("{} = %s".format(quote(key.lower())))
550
607
  args.append(val)
551
- join = ','
552
- return ' '.join(sql), tuple(args)
608
+ join = ","
609
+ return " ".join(sql), tuple(args)
553
610
 
554
611
  @classmethod
555
612
  def views(cls, system=False):
556
613
  if system:
557
- return "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE LIKE 'VIEW';", tuple()
614
+ return (
615
+ "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE LIKE 'VIEW';",
616
+ tuple(),
617
+ )
558
618
  else:
559
- return "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE LIKE 'VIEW';", tuple()
619
+ return (
620
+ "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE LIKE 'VIEW';",
621
+ tuple(),
622
+ )
560
623
 
561
624
  class TYPES(object):
562
- TEXT = 'TEXT'
563
- INTEGER = 'INTEGER'
564
- NUMERIC = 'NUMERIC'
565
- DATETIME = 'DATETIME'
566
- TIMESTAMP = 'TIMESTAMP'
567
- DATE = 'DATE'
568
- TIME = 'TIME'
569
- BIGINT = 'BIGINT'
570
- SMALLINT = 'SMALLINT'
571
- BOOLEAN = 'BIT'
572
- BINARY = 'BLOB'
573
- INTERVAL = 'INTERVAL'
574
-
575
- reserved_words = ['ACCESSIBLE','ADD','ALL','ALTER','ANALYZE','AND','AS','ASC','ASENSITIVE','BEFORE','BETWEEN','BIGINT','BINARY','BLOB','BOTH','BY','CALL','CASCADE','CASE','CHANGE','CHAR','CHARACTER','CHECK','COLLATE','COLUMN','CONDITION','CONSTRAINT','CONTINUE','CONVERT','CREATE','CROSS','CURRENT_DATE','CURRENT_TIME','CURRENT_TIMESTAMP','CURRENT_USER','CURSOR','DATABASE','DATABASES','DAY_HOUR','DAY_MICROSECOND','DAY_MINUTE','DAY_SECOND','DEC','DECIMAL','DECLARE','DEFAULT','DELAYED','DELETE','DESC','DESCRIBE','DETERMINISTIC','DISTINCT','DISTINCTROW','DIV','DOUBLE','DROP','DUAL','EACH','ELSE','ELSEIF','ENCLOSED','ESCAPED','EXISTS','EXIT','EXPLAIN','FALSE','FETCH','FLOAT','FLOAT4','FLOAT8','FOR','FORCE','FOREIGN','FROM','FULLTEXT','GENERAL','GRANT','GROUP','HAVING','HIGH_PRIORITY','HOUR_MICROSECOND','HOUR_MINUTE','HOUR_SECOND','IF','IGNORE','IGNORE_SERVER_IDS','IN','INDEX','INFILE','INNER','INOUT','INSENSITIVE','INSERT','INT','INT1','INT2','INT3','INT4','INT8','INTEGER','INTERVAL','INTO','IS','ITERATE','JOIN','KEY','KEYS','KILL','LEADING','LEAVE','LEFT','LIKE','LIMIT','LINEAR','LINES','LOAD','LOCALTIME','LOCALTIMESTAMP','LOCK','LONG','LONGBLOB','LONGTEXT','LOOP','LOW_PRIORITY','MASTER_HEARTBEAT_PERIOD','MASTER_SSL_VERIFY_SERVER_CERT','MATCH','MAXVALUE','MEDIUMBLOB','MEDIUMINT','MEDIUMTEXT','MIDDLEINT','MINUTE_MICROSECOND','MINUTE_SECOND','MOD','MODIFIES','NATURAL','NOT','NO_WRITE_TO_BINLOG','NULL','NUMERIC','ON','OPTIMIZE','OPTION','OPTIONALLY','OR','ORDER','OUT','OUTER','OUTFILE','PRECISION','PRIMARY','PROCEDURE','PROXY','PURGE','RANGE','READ','READS','READ_WRITE','REAL','REFERENCES','REGEXP','RELAY','RELEASE','RENAME','REPEAT','REPLACE','REQUIRE','RESIGNAL','RESTRICT','RETURN','REVOKE','RIGHT','RLIKE','SCHEMA','SCHEMAS','SECOND_MICROSECOND','SELECT','SENSITIVE','SEPARATOR','SET','SHOW','SIGNAL','SLOW','SMALLINT','SPATIAL','SPECIFIC','SQL','SQLEXCEPTION','SQLSTATE','SQLWARNING','SQL_BIG_RESULT','SQL_CALC_FOUND_ROWS','SQL_SMALL_RESULT','SSL','STARTING','STRAIGHT_JOIN','TABLE','TERMINATED','THEN','TIMESTAMP','TINYBLOB','TINYINT','TINYTEXT','TO','TRAILING','TRIGGER','TRUE','UNDO','UNION','UNIQUE','UNLOCK','UNSIGNED','UPDATE','USAGE','USE','USING','UTC_DATE','UTC_TIME','UTC_TIMESTAMP','VALUES','VARBINARY','VARCHAR','VARCHARACTER','VARYING','WHEN','WHERE','WHILE','WITH','WRITE','XOR','YEAR_MONTH','ZEROFILL']
625
+ TEXT = "TEXT"
626
+ INTEGER = "INTEGER"
627
+ NUMERIC = "NUMERIC"
628
+ DATETIME = "DATETIME"
629
+ TIMESTAMP = "TIMESTAMP"
630
+ DATE = "DATE"
631
+ TIME = "TIME"
632
+ BIGINT = "BIGINT"
633
+ SMALLINT = "SMALLINT"
634
+ BOOLEAN = "BIT"
635
+ BINARY = "BLOB"
636
+ INTERVAL = "INTERVAL"
637
+
638
+
639
+ reserved_words = [
640
+ "ACCESSIBLE",
641
+ "ADD",
642
+ "ALL",
643
+ "ALTER",
644
+ "ANALYZE",
645
+ "AND",
646
+ "AS",
647
+ "ASC",
648
+ "ASENSITIVE",
649
+ "BEFORE",
650
+ "BETWEEN",
651
+ "BIGINT",
652
+ "BINARY",
653
+ "BLOB",
654
+ "BOTH",
655
+ "BY",
656
+ "CALL",
657
+ "CASCADE",
658
+ "CASE",
659
+ "CHANGE",
660
+ "CHAR",
661
+ "CHARACTER",
662
+ "CHECK",
663
+ "COLLATE",
664
+ "COLUMN",
665
+ "CONDITION",
666
+ "CONSTRAINT",
667
+ "CONTINUE",
668
+ "CONVERT",
669
+ "CREATE",
670
+ "CROSS",
671
+ "CURRENT_DATE",
672
+ "CURRENT_TIME",
673
+ "CURRENT_TIMESTAMP",
674
+ "CURRENT_USER",
675
+ "CURSOR",
676
+ "DATABASE",
677
+ "DATABASES",
678
+ "DAY_HOUR",
679
+ "DAY_MICROSECOND",
680
+ "DAY_MINUTE",
681
+ "DAY_SECOND",
682
+ "DEC",
683
+ "DECIMAL",
684
+ "DECLARE",
685
+ "DEFAULT",
686
+ "DELAYED",
687
+ "DELETE",
688
+ "DESC",
689
+ "DESCRIBE",
690
+ "DETERMINISTIC",
691
+ "DISTINCT",
692
+ "DISTINCTROW",
693
+ "DIV",
694
+ "DOUBLE",
695
+ "DROP",
696
+ "DUAL",
697
+ "EACH",
698
+ "ELSE",
699
+ "ELSEIF",
700
+ "ENCLOSED",
701
+ "ESCAPED",
702
+ "EXISTS",
703
+ "EXIT",
704
+ "EXPLAIN",
705
+ "FALSE",
706
+ "FETCH",
707
+ "FLOAT",
708
+ "FLOAT4",
709
+ "FLOAT8",
710
+ "FOR",
711
+ "FORCE",
712
+ "FOREIGN",
713
+ "FROM",
714
+ "FULLTEXT",
715
+ "GENERAL",
716
+ "GRANT",
717
+ "GROUP",
718
+ "HAVING",
719
+ "HIGH_PRIORITY",
720
+ "HOUR_MICROSECOND",
721
+ "HOUR_MINUTE",
722
+ "HOUR_SECOND",
723
+ "IF",
724
+ "IGNORE",
725
+ "IGNORE_SERVER_IDS",
726
+ "IN",
727
+ "INDEX",
728
+ "INFILE",
729
+ "INNER",
730
+ "INOUT",
731
+ "INSENSITIVE",
732
+ "INSERT",
733
+ "INT",
734
+ "INT1",
735
+ "INT2",
736
+ "INT3",
737
+ "INT4",
738
+ "INT8",
739
+ "INTEGER",
740
+ "INTERVAL",
741
+ "INTO",
742
+ "IS",
743
+ "ITERATE",
744
+ "JOIN",
745
+ "KEY",
746
+ "KEYS",
747
+ "KILL",
748
+ "LEADING",
749
+ "LEAVE",
750
+ "LEFT",
751
+ "LIKE",
752
+ "LIMIT",
753
+ "LINEAR",
754
+ "LINES",
755
+ "LOAD",
756
+ "LOCALTIME",
757
+ "LOCALTIMESTAMP",
758
+ "LOCK",
759
+ "LONG",
760
+ "LONGBLOB",
761
+ "LONGTEXT",
762
+ "LOOP",
763
+ "LOW_PRIORITY",
764
+ "MASTER_HEARTBEAT_PERIOD",
765
+ "MASTER_SSL_VERIFY_SERVER_CERT",
766
+ "MATCH",
767
+ "MAXVALUE",
768
+ "MEDIUMBLOB",
769
+ "MEDIUMINT",
770
+ "MEDIUMTEXT",
771
+ "MIDDLEINT",
772
+ "MINUTE_MICROSECOND",
773
+ "MINUTE_SECOND",
774
+ "MOD",
775
+ "MODIFIES",
776
+ "NATURAL",
777
+ "NOT",
778
+ "NO_WRITE_TO_BINLOG",
779
+ "NULL",
780
+ "NUMERIC",
781
+ "ON",
782
+ "OPTIMIZE",
783
+ "OPTION",
784
+ "OPTIONALLY",
785
+ "OR",
786
+ "ORDER",
787
+ "OUT",
788
+ "OUTER",
789
+ "OUTFILE",
790
+ "PRECISION",
791
+ "PRIMARY",
792
+ "PROCEDURE",
793
+ "PROXY",
794
+ "PURGE",
795
+ "RANGE",
796
+ "READ",
797
+ "READS",
798
+ "READ_WRITE",
799
+ "REAL",
800
+ "REFERENCES",
801
+ "REGEXP",
802
+ "RELAY",
803
+ "RELEASE",
804
+ "RENAME",
805
+ "REPEAT",
806
+ "REPLACE",
807
+ "REQUIRE",
808
+ "RESIGNAL",
809
+ "RESTRICT",
810
+ "RETURN",
811
+ "REVOKE",
812
+ "RIGHT",
813
+ "RLIKE",
814
+ "SCHEMA",
815
+ "SCHEMAS",
816
+ "SECOND_MICROSECOND",
817
+ "SELECT",
818
+ "SENSITIVE",
819
+ "SEPARATOR",
820
+ "SET",
821
+ "SHOW",
822
+ "SIGNAL",
823
+ "SLOW",
824
+ "SMALLINT",
825
+ "SPATIAL",
826
+ "SPECIFIC",
827
+ "SQL",
828
+ "SQLEXCEPTION",
829
+ "SQLSTATE",
830
+ "SQLWARNING",
831
+ "SQL_BIG_RESULT",
832
+ "SQL_CALC_FOUND_ROWS",
833
+ "SQL_SMALL_RESULT",
834
+ "SSL",
835
+ "STARTING",
836
+ "STRAIGHT_JOIN",
837
+ "TABLE",
838
+ "TERMINATED",
839
+ "THEN",
840
+ "TIMESTAMP",
841
+ "TINYBLOB",
842
+ "TINYINT",
843
+ "TINYTEXT",
844
+ "TO",
845
+ "TRAILING",
846
+ "TRIGGER",
847
+ "TRUE",
848
+ "UNDO",
849
+ "UNION",
850
+ "UNIQUE",
851
+ "UNLOCK",
852
+ "UNSIGNED",
853
+ "UPDATE",
854
+ "USAGE",
855
+ "USE",
856
+ "USING",
857
+ "UTC_DATE",
858
+ "UTC_TIME",
859
+ "UTC_TIMESTAMP",
860
+ "VALUES",
861
+ "VARBINARY",
862
+ "VARCHAR",
863
+ "VARCHARACTER",
864
+ "VARYING",
865
+ "WHEN",
866
+ "WHERE",
867
+ "WHILE",
868
+ "WITH",
869
+ "WRITE",
870
+ "XOR",
871
+ "YEAR_MONTH",
872
+ "ZEROFILL",
873
+ ]