· 6 years ago · Jun 06, 2019, 06:00 PM
1PYTHONPATH=. python -m pytest -vv -s api/tests/api_requests_test/test_data_loading.py::test_source_api
2================================================================ test session starts =================================================================
3platform linux -- Python 3.6.7, pytest-3.2.5, py-1.8.0, pluggy-0.4.0 -- /home/matheusih/pyenv/s1search/bin/python
4cachedir: .cache
5rootdir: /home/matheusih/api-s1search/slicing_dice-api_python3, inifile:
6plugins: xdist-1.22.2, forked-1.0.2, cov-2.5.1, asyncio-0.8.0
7collected 1 item
8
9api/tests/api_requests_test/test_data_loading.py::test_source_api [api_sd][ERROR][PID 12347][2019-06-06 14:53:51] Retry MySQL fail. Executing rollback on MySQL, to remove all created tables.
10ERROR
11
12======================================================================= ERRORS =======================================================================
13_________________________________________________________ ERROR at setup of test_source_api __________________________________________________________
14
15auth_info = {'client_id': 11, 'dimensions': [], 'project': Project(name="Test Purpose"), 'project_id': 31229, ...}
16dimensions = [{'api-name': 'default', 'name': 'default'}], auto_create_dimensions = True
17
18 async def create_dimensions(auth_info, dimensions,
19 auto_create_dimensions=False):
20 project_id = auth_info['project_id']
21 permission = auth_info.get('permission_level')
22
23 dimension_models = []
24 if not isinstance(dimensions, list):
25 dimensions = [dimensions]
26
27 def create_dimension(db, model):
28 print_async_message("Adding dimension to MySQL")
29 db.add(model)
30 try:
31 db.commit()
32 except exc.IntegrityError as err:
33 """
34 Means that the dimension already exists
35 try to look for deleted dimensions
36 """
37 db.rollback()
38 dimension_db = db.query(models.Dimension).filter(
39 models.Dimension.api_name == model.api_name).filter(
40 models.Dimension.project_id == model.project_id).first()
41 if dimension_db:
42 dimension_db.deleted = False
43 dimension_db.deleted_at = None
44 db.commit()
45 else:
46 LOGGER.error(err)
47 raise err
48 print_async_message("Finishing dimension to MySQL", finish=True)
49
50 existing_dimensions = auth_info['dimensions']
51 replication_messages = []
52 slugs = []
53 dimensions_already_created = []
54 for dimension in dimensions:
55 relational_model_type = dimension.get('relational-model-type', None)
56
57 if relational_model_type is not None and \
58 relational_model_type not in RELATIONAL_MODELS_TYPES:
59 raise exceptions.DimensionInvalidValueError(
60 "relational-model-type", "relational_model_type",
61 "The value should be 'fact' or 'dimension'")
62
63 if relational_model_type is not None and relational_model_type == RELATIONAL_MODELS_TYPES[0]:
64 relational_model_type = 1
65 elif relational_model_type is not None and relational_model_type == RELATIONAL_MODELS_TYPES[1]:
66 relational_model_type = 2
67
68 name = dimension.get('name')
69 validate_dimension_name(name)
70
71 api_name = dimension.get('api-name')
72 if api_name:
73 validate_dimension_name(api_name)
74
75 is_logical = dimension.get('is-logical', False)
76
77 if is_logical and permission != 4:
78 raise exceptions.AuthIncorrectPermissionError(more_info="You can't create logical databases using API")
79
80 dimension = models.Dimension(
81 name=name,
82 api_name=api_name,
83 description=dimension.get('description', None),
84 relational_model=relational_model_type,
85 project_id=project_id,
86 is_logical=is_logical,
87 created_at=datetime.utcnow()
88 )
89 dimension.build_slug_name()
90
91 validate_dimension_name(dimension.name)
92 validate_dimension_name(dimension.api_name)
93
94 if dimension.api_name in existing_dimensions:
95 if not auto_create_dimensions:
96 raise exceptions.DimensionAlreadyExistsError(
97 dimension.api_name)
98 else:
99 continue
100
101 should_insert_to_database = dimension not in existing_dimensions
102
103 try:
104 if should_insert_to_database:
105 print_async_message("Adding dimension to DB")
106 async with RetryMySQL(create_dimension, dimension,
107> get_last_error=True) as result:
108
109api/lib/dimension.py:118:
110_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
111
112self = <api.lib.mysql_retry.RetryMySQL object at 0x7f6d4c74afd0>
113
114 async def __aenter__(self):
115 def inside_method():
116 for i in range(MYSQL_MAX_RETRIES):
117 db = get_mysql_session()
118 try:
119 return self.function(db, *self.args)
120 except:
121 if self.get_last_error:
122 self.traceback_captured = traceback.format_exc()
123 else:
124 self.traceback_captured += traceback.format_exc()
125 time.sleep(1)
126 db.rollback()
127 finally:
128 db.commit()
129 db.close()
130 else:
131 # Raises an exception if all retries attempts fail
132 raise RetryMySQLException(self.traceback_captured)
133
134 # Reconnects to the MySQL
135> returned = await run_sql_async(inside_method)
136
137api/lib/mysql_retry.py:53:
138_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
139
140method_to_run = <function RetryMySQL.__aenter__.<locals>.inside_method at 0x7f6d4c7f4730>
141
142 async def run_sql_async(method_to_run):
143 loop = asyncio.get_event_loop()
144 result = loop.run_in_executor(THREAD_POOL_EXECUTOR, method_to_run)
145
146> return await result
147
148api/__init__.py:644:
149_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
150
151self = None
152
153 def run(self):
154 if not self.future.set_running_or_notify_cancel():
155 return
156
157 try:
158> result = self.fn(*self.args, **self.kwargs)
159
160/usr/lib/python3.6/concurrent/futures/thread.py:56:
161_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
162
163 def inside_method():
164 for i in range(MYSQL_MAX_RETRIES):
165 db = get_mysql_session()
166 try:
167 return self.function(db, *self.args)
168 except:
169 if self.get_last_error:
170 self.traceback_captured = traceback.format_exc()
171 else:
172 self.traceback_captured += traceback.format_exc()
173 time.sleep(1)
174 db.rollback()
175 finally:
176 db.commit()
177 db.close()
178 else:
179 # Raises an exception if all retries attempts fail
180> raise RetryMySQLException(self.traceback_captured)
181E api.lib.mysql_retry.RetryMySQLException: Traceback (most recent call last):
182E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
183E cursor, statement, parameters, context
184E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
185E cursor.execute(statement, parameters)
186E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 250, in execute
187E self.errorhandler(self, exc, value)
188E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
189E raise errorvalue
190E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 247, in execute
191E res = self._query(query)
192E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 411, in _query
193E rowcount = self._do_query(q)
194E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 374, in _do_query
195E db.query(q)
196E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/connections.py", line 277, in query
197E _mysql.connection.query(self, query)
198E _mysql_exceptions.OperationalError: (1054, "Unknown column 'is_logical' in 'field list'")
199E
200E The above exception was the direct cause of the following exception:
201E
202E Traceback (most recent call last):
203E File "/home/matheusih/api-s1search/slicing_dice-api_python3/api/lib/mysql_retry.py", line 37, in inside_method
204E return self.function(db, *self.args)
205E File "/home/matheusih/api-s1search/slicing_dice-api_python3/api/lib/dimension.py", line 42, in create_dimension
206E db.commit()
207E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 1026, in commit
208E self.transaction.commit()
209E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 493, in commit
210E self._prepare_impl()
211E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 472, in _prepare_impl
212E self.session.flush()
213E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2451, in flush
214E self._flush(objects)
215E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2589, in _flush
216E transaction.rollback(_capture_exception=True)
217E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
218E compat.reraise(exc_type, exc_value, exc_tb)
219E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 129, in reraise
220E raise value
221E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2549, in _flush
222E flush_context.execute()
223E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
224E rec.execute(self)
225E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
226E uow,
227E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj
228E insert,
229E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1120, in _emit_insert_statements
230E statement, params
231E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 988, in execute
232E return meth(self, multiparams, params)
233E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
234E return connection._execute_clauseelement(self, multiparams, params)
235E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
236E distilled_params,
237E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1248, in _execute_context
238E e, statement, parameters, cursor, context
239E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
240E util.raise_from_cause(sqlalchemy_exception, exc_info)
241E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
242E reraise(type(exception), exception, tb=exc_tb, cause=cause)
243E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 128, in reraise
244E raise value.with_traceback(tb)
245E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
246E cursor, statement, parameters, context
247E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
248E cursor.execute(statement, parameters)
249E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 250, in execute
250E self.errorhandler(self, exc, value)
251E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
252E raise errorvalue
253E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 247, in execute
254E res = self._query(query)
255E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 411, in _query
256E rowcount = self._do_query(q)
257E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 374, in _do_query
258E db.query(q)
259E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/connections.py", line 277, in query
260E _mysql.connection.query(self, query)
261E sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1054, "Unknown column 'is_logical' in 'field list'")
262E [SQL: INSERT INTO `Dimension` (name, api_name, project_id, description, created_at, updated_at, deleted, deleted_at, relational_model, is_logical) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
263E [parameters: ('default', 'default', 31229, None, datetime.datetime(2019, 6, 6, 17, 53, 49, 824819), None, 0, None, None, 0)]
264E (Background on this error at: http://sqlalche.me/e/e3q8)
265
266api/lib/mysql_retry.py:50: RetryMySQLException
267
268During handling of the above exception, another exception occurred:
269
270args = (), kwargs = {'request': <SubRequest 'create_project_for_panel' for <Function 'test_source_api'>>}
271loop = <_UnixSelectorEventLoop running=False closed=False debug=False>
272setup = <function pytest_fixture_setup.<locals>.wrapper.<locals>.setup at 0x7f6d600faea0>
273
274 def wrapper(*args, **kwargs):
275 loop = kwargs['event_loop']
276 if strip_event_loop:
277 del kwargs['event_loop']
278
279 async def setup():
280 res = await f(*args, **kwargs)
281 return res
282
283> return loop.run_until_complete(setup())
284
285../../pyenv/s1search/lib/python3.6/site-packages/pytest_asyncio/plugin.py:120:
286_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
287/usr/lib/python3.6/asyncio/base_events.py:473: in run_until_complete
288 return future.result()
289../../pyenv/s1search/lib/python3.6/site-packages/pytest_asyncio/plugin.py:117: in setup
290 res = await f(*args, **kwargs)
291api/tests/conftest.py:397: in create_project_for_panel
292 auth_info, dimensions, auto_create_dimensions=True)
293_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
294
295auth_info = {'client_id': 11, 'dimensions': [], 'project': Project(name="Test Purpose"), 'project_id': 31229, ...}
296dimensions = [{'api-name': 'default', 'name': 'default'}], auto_create_dimensions = True
297
298 async def create_dimensions(auth_info, dimensions,
299 auto_create_dimensions=False):
300 project_id = auth_info['project_id']
301 permission = auth_info.get('permission_level')
302
303 dimension_models = []
304 if not isinstance(dimensions, list):
305 dimensions = [dimensions]
306
307 def create_dimension(db, model):
308 print_async_message("Adding dimension to MySQL")
309 db.add(model)
310 try:
311 db.commit()
312 except exc.IntegrityError as err:
313 """
314 Means that the dimension already exists
315 try to look for deleted dimensions
316 """
317 db.rollback()
318 dimension_db = db.query(models.Dimension).filter(
319 models.Dimension.api_name == model.api_name).filter(
320 models.Dimension.project_id == model.project_id).first()
321 if dimension_db:
322 dimension_db.deleted = False
323 dimension_db.deleted_at = None
324 db.commit()
325 else:
326 LOGGER.error(err)
327 raise err
328 print_async_message("Finishing dimension to MySQL", finish=True)
329
330 existing_dimensions = auth_info['dimensions']
331 replication_messages = []
332 slugs = []
333 dimensions_already_created = []
334 for dimension in dimensions:
335 relational_model_type = dimension.get('relational-model-type', None)
336
337 if relational_model_type is not None and \
338 relational_model_type not in RELATIONAL_MODELS_TYPES:
339 raise exceptions.DimensionInvalidValueError(
340 "relational-model-type", "relational_model_type",
341 "The value should be 'fact' or 'dimension'")
342
343 if relational_model_type is not None and relational_model_type == RELATIONAL_MODELS_TYPES[0]:
344 relational_model_type = 1
345 elif relational_model_type is not None and relational_model_type == RELATIONAL_MODELS_TYPES[1]:
346 relational_model_type = 2
347
348 name = dimension.get('name')
349 validate_dimension_name(name)
350
351 api_name = dimension.get('api-name')
352 if api_name:
353 validate_dimension_name(api_name)
354
355 is_logical = dimension.get('is-logical', False)
356
357 if is_logical and permission != 4:
358 raise exceptions.AuthIncorrectPermissionError(more_info="You can't create logical databases using API")
359
360 dimension = models.Dimension(
361 name=name,
362 api_name=api_name,
363 description=dimension.get('description', None),
364 relational_model=relational_model_type,
365 project_id=project_id,
366 is_logical=is_logical,
367 created_at=datetime.utcnow()
368 )
369 dimension.build_slug_name()
370
371 validate_dimension_name(dimension.name)
372 validate_dimension_name(dimension.api_name)
373
374 if dimension.api_name in existing_dimensions:
375 if not auto_create_dimensions:
376 raise exceptions.DimensionAlreadyExistsError(
377 dimension.api_name)
378 else:
379 continue
380
381 should_insert_to_database = dimension not in existing_dimensions
382
383 try:
384 if should_insert_to_database:
385 print_async_message("Adding dimension to DB")
386 async with RetryMySQL(create_dimension, dimension,
387 get_last_error=True) as result:
388 returned_function = result
389 dimension_models.append(dimension)
390 existing_dimensions.append(dimension.name)
391 clear_project_cache(project_id)
392 if dimension.is_logical:
393 auth_info["logical_dimensions"].append(dimension.name)
394
395 print_async_message("adding dimension to DB", finish=True)
396 except (RetryMySQLException, exceptions.InternalError) as e:
397 traceback_captured = e.traceback_captured
398 if util.DUPLICATE_ENTRY_ERROR_REGEX.search(traceback_captured):
399 LOGGER.info(
400 "Match IntegrityError, for table: %s\nThis table already "
401 "created by another API instance and can be removed on "
402 "current list to create.",
403 dimension.api_name)
404 dimensions_already_created.append(dimension.api_name)
405 else:
406 LOGGER.error(
407 "Retry MySQL fail. Executing rollback on MySQL,"
408 " to remove all created tables.")
409 for item in dimension_models:
410 remove_dimension_mysql(item)
411 existing_dimensions.remove(dimension.name)
412 raise exceptions.InternalError(
413> traceback_captured=traceback_captured)
414E api.lib.exceptions.InternalError: Traceback (most recent call last):
415E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
416E cursor, statement, parameters, context
417E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
418E cursor.execute(statement, parameters)
419E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 250, in execute
420E self.errorhandler(self, exc, value)
421E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
422E raise errorvalue
423E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 247, in execute
424E res = self._query(query)
425E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 411, in _query
426E rowcount = self._do_query(q)
427E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 374, in _do_query
428E db.query(q)
429E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/connections.py", line 277, in query
430E _mysql.connection.query(self, query)
431E _mysql_exceptions.OperationalError: (1054, "Unknown column 'is_logical' in 'field list'")
432E
433E The above exception was the direct cause of the following exception:
434E
435E Traceback (most recent call last):
436E File "/home/matheusih/api-s1search/slicing_dice-api_python3/api/lib/mysql_retry.py", line 37, in inside_method
437E return self.function(db, *self.args)
438E File "/home/matheusih/api-s1search/slicing_dice-api_python3/api/lib/dimension.py", line 42, in create_dimension
439E db.commit()
440E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 1026, in commit
441E self.transaction.commit()
442E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 493, in commit
443E self._prepare_impl()
444E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 472, in _prepare_impl
445E self.session.flush()
446E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2451, in flush
447E self._flush(objects)
448E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2589, in _flush
449E transaction.rollback(_capture_exception=True)
450E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
451E compat.reraise(exc_type, exc_value, exc_tb)
452E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 129, in reraise
453E raise value
454E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2549, in _flush
455E flush_context.execute()
456E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
457E rec.execute(self)
458E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
459E uow,
460E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj
461E insert,
462E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1120, in _emit_insert_statements
463E statement, params
464E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 988, in execute
465E return meth(self, multiparams, params)
466E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
467E return connection._execute_clauseelement(self, multiparams, params)
468E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
469E distilled_params,
470E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1248, in _execute_context
471E e, statement, parameters, cursor, context
472E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
473E util.raise_from_cause(sqlalchemy_exception, exc_info)
474E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
475E reraise(type(exception), exception, tb=exc_tb, cause=cause)
476E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 128, in reraise
477E raise value.with_traceback(tb)
478E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
479E cursor, statement, parameters, context
480E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
481E cursor.execute(statement, parameters)
482E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 250, in execute
483E self.errorhandler(self, exc, value)
484E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
485E raise errorvalue
486E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 247, in execute
487E res = self._query(query)
488E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 411, in _query
489E rowcount = self._do_query(q)
490E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/cursors.py", line 374, in _do_query
491E db.query(q)
492E File "/home/matheusih/pyenv/s1search/lib/python3.6/site-packages/MySQLdb/connections.py", line 277, in query
493E _mysql.connection.query(self, query)
494E sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1054, "Unknown column 'is_logical' in 'field list'")
495E [SQL: INSERT INTO `Dimension` (name, api_name, project_id, description, created_at, updated_at, deleted, deleted_at, relational_model, is_logical) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
496E [parameters: ('default', 'default', 31229, None, datetime.datetime(2019, 6, 6, 17, 53, 49, 824819), None, 0, None, None, 0)]
497E (Background on this error at: http://sqlalche.me/e/e3q8)
498
499api/lib/dimension.py:144: InternalError
500============================================================== 1 error in 2.63 seconds ===============================================================
501Sentry is attempting to send 1 pending error messages
502Waiting up to 10 seconds
503Press Ctrl-C to quit
504[sentry.errors][ERROR][PID 12347][2019-06-06 14:53:53] Sentry responded with an API error: RateLimited(Creation of this event was denied due to rate limiting)
505b'Sentry responded with an API error: RateLimited(Creation of this event was denied due to rate limiting)'
506[sentry.errors.uncaught][ERROR][PID 12347][2019-06-06 14:53:53] ['Retry MySQL fail. Executing rollback on MySQL, to remove all created tables.']
507b"['Retry MySQL fail. Executing rollback on MySQL, to remove all created tables.']"