'Prepare and execute a database operation (query or command).
Parameters may be provided as sequence or mapping and will be bound to variables in the operation.
Variables are specified in a database-specific notation
(see the module\'s paramstyle attribute for details). [5]
A reference to the operation will be retained by the cursor.
If the same operation object is passed in again, then the cursor
can optimize its behavior. This is most effective for algorithms
where the same operation is used, but different parameters are bound to it (many times).
For maximum efficiency when reusing an operation, it is best to use
the setinputsizes() method to specify the parameter types and sizes ahead of time.
It is legal for a parameter to not match the predefined information;
the implementation should compensate, possibly with a loss of efficiency.
The parameters may also be specified as list of tuples to e.g. insert multiple rows in
a single operation, but this kind of usage is depreciated: executemany() should be used instead.
Return values are not defined.
[5] The module will use the __getitem__ method of the parameters object to map either positions
(integers) or names (strings) to parameter values. This allows for both sequences and mappings
to be used as input.
The term "bound" refers to the process of binding an input value to a database execution buffer.
In practical terms, this means that the input value is directly used as a value in the operation.
The client should not be required to "escape" the value so that it can be used -- the value
should be equal to the actual database value.'

def execute(self, operation, parameters=None):

    self.messages = []
    self._executeHelper(operation, False, parameters)
