I'm using Python 2.7.3 with Flask 0.10.1 and SQL-Alchemy 0.9.1.
In my view code, I'm building an object for database input, and my code depends on the proper execution of two try
/except
/else
blocks. It works as expected for the first block, both when exceptions occur and when they do not. When there's an exception, I get a collection of errors
. When there's not an exception, the data get added to the database and the sample counter increments. Here's that snippet:
try:
new_sample = Sample()
new_sample.build(sample)
except SampleBuildingError as e:
result_response['errors'].append('{0}: {1}'.format(sample['sample_name'], e.value) )
else:
db.session.add(new_sample)
num_added += 1
Further down in the view function, I have a try
/except
/else
/finally
block. The data are being committed to the database, so the try
portion is clearly working, as is the finally
block. However, it appears that the else
block is not being executed:
try:
db.session.commit()
except Exception as e:
result_response['error'] = "Failed on the database input: {0}".format( str(e) )
else:
result_response['success'] = "The samples were input to the database successfully. {0} samples entered into the database, with {1} errors".format( num_added, len(errors) )
finally:
return jsonify(result_response)
When there's an exception, I get json back with an error
key and the database error, as expected. However, when the database commit is succesfully, I get a json object with every expected key except the success
key.
It appears that the else
block is being skipped, but I can't figure out why. I've tried putting the word bogus
in the second line of the else block to try to force an error, but Python doesn't complain!
Here's the full view function:
@app.route("/kapasubmit", methods=['POST'])
def kapasubmit():
num_added = 0
result_response = {'errors': []}
samples = request.json['data']
for sample in samples:
sample_check = Sample.query.filter_by( sample_name = sample['sample_name'] ).first()
if sample_check is None:
try:
new_sample = Sample()
new_sample.build(sample)
except SampleBuildingError as e:
result_response['errors'].append('{0}: {1}'.format(sample['sample_name'], e.value) )
else:
db.session.add(new_sample)
num_added += 1
else:
result_response['errors'].append('{0}: This is a duplicate sample'.format(sample['sample_name']) )
if num_added > 0:
try:
db.session.commit()
except Exception as e:
result_response['error'] = "Failed on the database input: {0}".format( str(e) )
else:
result_response['success'] = "The samples were input to the database successfully. {0} samples entered into the database, with {1} errors".format( num_added, len(errors) )
bogus
finally:
return jsonify(result_response)
else:
result_response['error'] = "No valid samples submitted for input"
return jsonify(result_response)