簡體   English   中英

flask db model 更新錯誤

[英]Error in the update of the flask db model

我正在使用帶有 mariadb 的 python/flask 創建一個簡單的應用程序

我幾乎完成了我的 CRUD,但是,更新不起作用。

代碼是:

from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import pymysql

pymysql.install_as_MySQLdb()

app = Flask(__name__)
db = SQLAlchemy(app)


app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://{username}:{password}@{server}/{db}".format(username = 'root', password = '', server = 'localhost', db = 'baby-tracker')

class Event(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    description = db.Column(db.String(100),nullable=False)
    

    def __repr__(self):
        return f"Event: {self.description}"
    
    def __init__(self,description):
        self.description = description

def format_event(event):
    return {
        "description": event.description,
        "id": event.id
        
    }

#Main page
@app.route('/')
def hello():
    return 'Hello mate!'

#Create an event
@app.route('/events', methods=["POST"])
def create_event():
    description = request.get_json('description')
    event = Event(**description)
    db.session.add(event)
    db.session.commit()
    return format_event(event)

#Get all events
@app.route('/events', methods=["GET"])
def get_events():
    events = Event.query.order_by(Event.id.asc()).all()
    event_list = []
    for event in events:
        event_list.append(format_event(event))
    
    return {"events": event_list}

#Get a single event
@app.route('/events/<id>', methods=["GET"])
def get_event(id):
    #Could do this: if request.method == 'GET':
    event = Event.query.filter_by(id=id).one()
    formatted_event = format_event(event)
    return formatted_event

#Get a single event
@app.route('/events/<id>', methods=["DELETE"])
def delete_event(id):
    event = Event.query.filter_by(id=id).one()
    db.session.delete(event)
    db.session.commit()
    return f'Event id {id} deleted'

#Update event
@app.route('/events/<id>', methods=["PUT"])
def update_event(id):
    event = Event.query.filter_by(id=id)
    description = request.get_json('description')
    event.update(dict(description = description))
    db.session.commit()
    formatted_event = format_event(event)
    return formatted_event

if __name__ == '__main__':
    app.run()

對於 PUT 請求,我收到以下錯誤:

JSON 我正在使用 postman 發送 put 請求:

{“描述”:“新測試”}

我得到的錯誤:

上述異常是以下異常的直接原因:

Traceback (most recent call last):
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\flask\app.py", line 2091, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\flask\app.py", line 2076, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\flask\app.py", line 2073, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\flask\app.py", line 1518, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\flask\app.py", line 1516, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\flask\app.py", line 1502, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "C:\Users\PC\Documents\estudo_python\projeto_integrado\backend\app.py", line 77, in update_event
    event.update(dict(description = description))
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\orm\query.py", line 3300, in update
    execution_options={"synchronize_session": synchronize_session},
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\orm\session.py", line 1712, in execute
    result = conn._execute_20(statement, params or {}, execution_options)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\engine\base.py", line 1705, in _execute_20
    return meth(self, args_10style, kwargs_10style, execution_options)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\sql\elements.py", line 334, in _execute_on_connection 
    self, multiparams, params, execution_options
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\engine\base.py", line 1582, in _execute_clauseelement 
    cache_hit=cache_hit,
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\engine\base.py", line 1944, in _execute_context       
    e, statement, parameters, cursor, context
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\engine\base.py", line 2125, in _handle_dbapi_exception    sqlalchemy_exception, with_traceback=exc_info[2], from_=e
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\util\compat.py", line 208, in raise_
    raise exception
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\engine\base.py", line 1901, in _execute_context       
    cursor, statement, parameters, context
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\sqlalchemy\engine\default.py", line 736, in do_execute
    cursor.execute(statement, parameters)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\pymysql\cursors.py", line 148, in execute
    result = self._query(query)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\pymysql\cursors.py", line 310, in _query
    conn.query(q)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\pymysql\connections.py", line 548, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\pymysql\connections.py", line 775, in _read_query_result
    result.read()
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\pymysql\connections.py", line 1156, in read
    first_packet = self.connection._read_packet()
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\pymysql\connections.py", line 725, in _read_packet
    packet.raise_for_error()
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\pymysql\protocol.py", line 221, in raise_for_error
    err.raise_mysql_exception(self._data)
  File "C:\Users\PC\.virtualenvs\backend-_y8cE5wK\lib\site-packages\pymysql\err.py", line 143, in raise_mysql_exception
    raise errorclass(errno, errval)
sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near \'\'description\': "\'new test\'"} WHERE event.id = \'1\'\' at line 1')
[SQL: UPDATE event SET description=%(description)s WHERE event.id = %(id_1)s]
[parameters: {'description': {'description': 'new test'}, 'id_1': '1'}]
(Background on this error at: https://sqlalche.me/e/14/f405)

我在 POST 事件中遇到了類似的錯誤,但我解決了它用 '**' 解包字典嘗試了與 PUT 類似的東西,但沒有得到積極的結果。

SqlAlchemy 不會將您的結構隱式轉換為字符串。 您需要json.dumps()存儲的值,因此它是一個字符串並將其傳遞給您的event.update()

但是,MySQL 的版本確實支持 JSON 作為數據類型。 If you create your column as JSON, then you can declare it in the SQLAlchemy model as JSON and then it will automatically handle the structure without you having to convert it to a JSON document.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM