2015-06-30 54 views
0

我試圖創建一個python燒瓶腳本,它將向數據庫添加一行。這裏是我的代碼:Python燒瓶:插入數據庫時​​無法調用'OperationalError'對象

main.py

import json 
import sys 
from flask import Flask, request 
from app.config import DB 
from app.items.items import ItemsAPI 
from app.users.accounts import AccountsAPI 
from app.users.customers import CustomersAPI 

app = Flask(__name__) 
db = DB() 

app.register_blueprint(ItemsAPI) 
app.register_blueprint(CustomersAPI) 
app.register_blueprint(AccountsAPI) 

@app.route('/home') 
def hello_world(): 
    return "Welcome to Omnimoda." 

@app.route('/dbtest', methods=['GET']) 
def hello_database(): 
    q_sql = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = %s" 
    a_sql = ("omnimoda",) 
    test_request = db.query(q_sql, a_sql) 
    result_request = test_request.fetchall() 
    if (result_request is None): 
     return "Database does not exist." 
    else: 
     return "Database exists." 

if __name__ == '__main__': 
    app.run(host = '0.0.0.0', debug=True) 

customers.py

from flask import Flask, request, jsonify, json, Blueprint 
#from time import mktime 
from json import dumps 
from datetime import datetime 
from app.config import DB 

CustomersAPI = Blueprint('CustomersAPI', __name__) 
db = DB() 

@CustomersAPI.route('/customers/addtest', methods=['POST']) 
def add_test(): 
    first_name = request.form['first_name'] 
    last_name = request.form['last_name'] 
    birthdate = request.form['birthdate'] 
    email = request.form['email'] 
    gender = request.form['gender'] 
    occupation = request.form['occupation'] 
    address = request.form['address'] 
    others = request.form['others'] 

    q_add_one = "INSERT INTO `customer_info` (`first_name`, `last_name`, `birthdate`, `init_email`, `gender`, `occupation`, `address`, `others`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)" 
    a_add_one = (first_name, last_name, birthdate, email, gender, occupation, address, others) 
    items_add = db.commit_ret_lastrow(q_add_one, a_add_one) 

    return items_add 

最後,我config.py

from flask import Flask 
import MySQLdb 

class DB: 
    conn = None 

    def connect(self): 
     self.conn = MySQLdb.connect(host="localhost", user="lance", passwd="lance", db="omnimoda") 
     self.conn.autocommit(True) 

    def query(self, sql, values): 
     try: 
      print values 
      self.connect() 
      cursor = self.conn.cursor() 
      cursor.execute(sql, values) 
      return cursor 
     except Exception, e: 
      return e 

    def commit_ret_lastrow(self, sql, values): 
     try: 
      self.connect() 
      cursor = self.conn.cursor() 
      cursor.execute(sql, values) 
      return cursor.lastrowid 
     except Exception, e: 
      return e 

不幸的是,當在CocoaRestClient測試它,通過http://127.0.0.1:5000/customers/addtest

enter image description here

我收到以下錯誤無益:

127.0.0.1 - - [30/Jun/2015 22:04:22] "POST /customers/addtest HTTP/1.1" 500 - 
Traceback (most recent call last): 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1478, in full_dispatch_request 
    response = self.make_response(rv) 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1577, in make_response 
    rv = self.response_class.force_type(rv, request.environ) 
    File "/Library/Python/2.7/site-packages/werkzeug/wrappers.py", line 841, in force_type 
    response = BaseResponse(*_run_wsgi_app(response, environ)) 
    File "/Library/Python/2.7/site-packages/werkzeug/test.py", line 867, in run_wsgi_app 
    app_iter = app(environ, start_response) 
TypeError: 'OperationalError' object is not callable 

而且我不知道什麼是錯的。我可以幫忙嗎?

回答

1

查詢和commit_ret_lastrow方法的最後兩行沒有任何意義。如果有例外,你就趕它吧,然後返回吧。所以Flask試圖將它作爲你的實際應用程序來執行,顯然它不能這樣做。

刪除這些行,並嘗試/除了完全。無論如何,你不應該抓住所有的例外;也許,如果你確定的話,你可以捕獲一個特定的數據庫異常 - 比如IntegrityError - 但通常你應該只捕獲那些你知道你可以處理的異常。否則,只需讓異常冒泡,框架就可以記錄或顯示它。

+0

我刪除了整個try/except,並發現了導致它的原因 - 我的一個字段在查詢中拼寫錯誤。我仍然得到'TypeError:'long'對象不可調用(可能與return語句有關,因爲它已插入到數據庫中)。無論如何,我可以問一個關於如何更好地實施嘗試/ DB連接部分除外的建議嗎?謝謝。 –

相關問題