python - 使用 Flask-SQLAlchemy 中的存储过程调用将 POST 方法发送到 SQL

标签 python stored-procedures flask sqlalchemy flask-sqlalchemy

我有一个有效的 SQL 存储过程,并在 Python 中设置了 Flask-sqlAlchemy 并连接到我的 MySQL 数据库。我正在尝试构建一个简单的 API,它将接受通过 URL 请求输入的 6-7 个请求参数,并将这些参数发送到我的调用过程,并根据在数据库表中插入新记录的存储过程相应地更新数据库( sp 是下面的“add_spotting”)。

我试图通过 POST 方法来执行此操作,并相信我正在正确接收请求参数参数并调用该过程,但我不确定如何执行这些过程并实际注入(inject)到数据库。

class Spotting(mysql.Model):
    __tablename__ = 'spotting'
    spotting_id = mysql.Column(mysql.Integer, primary_key = True)
    animal_id = mysql.Column(mysql.Integer, mysql.ForeignKey('animal.animal_id'), nullable=False)
    user_id = mysql.Column(mysql.Integer, mysql.ForeignKey('user.user_id'), nullable=False)
    trail_id = mysql.Column(mysql.Integer, mysql.ForeignKey('trail.trail_id'), nullable=False)
    quantity = mysql.Column(mysql.Integer, nullable = False)
    lat = mysql.Column(mysql.Float, nullable=True)
    lon = mysql.Column(mysql.Float, nullable=True)
    description = mysql.Column(mysql.String(250), nullable=False)


#Post method 
@application.route('/spotting', methods=['POST'])
def postSpotting():
    animal = request.args.get('animal')
    user = request.args.get('user')
    trail = request.args.get('trail')
    quantity = request.args.get('quantity')
    lat = request.args.get('lat')
    lon = request.args.get('lon')
    desc = request.args.get('desc')
    proc_call = "call add_spotting('" + animal + "','"+ user + "','" + trail + \
                "','" + quantity + "','" + lat + "','" + lon + "','" + desc + "')"
    mysql.engine.execute(proc_call)

    ### Here I want to post and commit this to the MySQL DB via the stored proc and return a message such as
    # ## 'Spotting successfully added'
    return ("Successfully posted!")

最佳答案

如果您只想使用您提供的代码测试 POST 请求,则可以简单地使用数据库模型对象来填充它:

#Post method 
@application.route('/spotting', methods=['POST'])
def postSpotting():
    animal = request.args.get('animal')
    user = request.args.get('user')
    trail = request.args.get('trail')
    quantity = request.args.get('quantity')
    lat = request.args.get('lat')
    lon = request.args.get('lon')
    desc = request.args.get('desc')
    proc_call = "call add_spotting('" + animal + "','"+ user + "','" + trail + \
                "','" + quantity + "','" + lat + "','" + lon + "','" + desc + "')"
    mysql.engine.execute(proc_call)

    ### create a new instance of your model
    new_post = Post()
    new_post.lat = lat
    new_post.lon = lon
    ... #etc

    ### commit your changes
    session = db.session
    session.add(new_post)
    db.session.commit()

    # ## 'Spotting successfully added'
    return ("Successfully posted!")

话虽如此,我要指出两件事:

  1. 通过 url 参数插入数据时,您应该小心。更推荐的方法是将数据传递给您的POST请求,并可能通过表单或身份验证进行验证

  2. 您可以为模型类创建启动器,以便更轻松地插入数据。例如:

class Spotting(mysql.Model):
    __tablename__ = 'spotting'
    spotting_id = mysql.Column(mysql.Integer, primary_key = True)
    animal_id = mysql.Column(mysql.Integer, mysql.ForeignKey('animal.animal_id'), nullable=False)
    user_id = mysql.Column(mysql.Integer, mysql.ForeignKey('user.user_id'), nullable=False)
    trail_id = mysql.Column(mysql.Integer, mysql.ForeignKey('trail.trail_id'), nullable=False)
    quantity = mysql.Column(mysql.Integer, nullable = False)
    lat = mysql.Column(mysql.Float, nullable=True)
    lon = mysql.Column(mysql.Float, nullable=True)
    description = mysql.Column(mysql.String(250), nullable=False)

    def __init__(self, lat, lon): #etc
        self.lat = lat
        self.lon = lon
        ## etc

        db.session.add(self)
        db.session.commit()

关于python - 使用 Flask-SQLAlchemy 中的存储过程调用将 POST 方法发送到 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57262157/

相关文章:

python - 使用 psycopg2 和 python 3.4 将数据从 csv 插入到 postgres 表

python - 带有请求的 flask 损坏的管道

mysql - 临时表不存在错误

sql - 如何在另一个存储过程中使用存储过程的结果?

php - 查询 : Calculate average price of stay depending on dates

python - Flask - 获取点击的链接信息并显示在呈现的页面上

python - 如何使用 XPath 选择一个单选按钮,后跟文本?

python - 在 Pandas 中使用 TQDM 进度条

python-3.x - 返回语句不在 Flask 中输出结果

flask - 根据flask admin中另一个字段的值显示字段