账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    flask SQLAlchemy 查询也要回滚吗?拿不到数据
    • 2019-07-03 00:00
    • 11
    93
    0

    先上代码:

    driver = db.session.query(Driver,Avatars).outerjoin(Avatars).filter_by(telephone=telephone).all()
    LOG.info(driver) # INFO in views: [(Driver name: websocket, age: 25 telephone:156***4289, Driver's avatar is telephone:156****4289, avatar:/home/nvidia/Public/avicii-02.png, type:0)]
    #LOG.debug(driver.__slots__) # 'list' object has no attribute '__slots__'
    if(driver):
        driverList = []
        for dr in driver:
            LOG.debug(dr.__slots__) #输出  [2019-07-03 14:32:43,402] DEBUG in views: ()
            driverList.append(dr.__slots__)
        return jsonify({"status":0,"msg":driverList})

    说明

    LOG.info(driver)控制台输出了查询结果,但是reture的driverList是[],postman显示内容如下:

    {
        "msg": [
            []
        ],
        "status": 0
    }

    控制台日志如下:

    2019-07-03 10:24:29,480 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
    2019-07-03 10:24:29,481 INFO sqlalchemy.engine.base.Engine SELECT driver.id AS driver_id, driver.name AS driver_name, driver.telephone AS driver_telephone, driver.age AS driver_age, avatars.id AS avatars_id, avatars.type AS avatars_type, avatars.telephone AS avatars_telephone, avatars.avatar AS avatars_avatar, avatars.`character` AS avatars_character
    FROM driver LEFT OUTER JOIN avatars ON driver.telephone = avatars.telephone
    WHERE avatars.telephone = %(telephone_1)s
    2019-07-03 10:24:29,481 INFO sqlalchemy.engine.base.Engine {'telephone_1': '156****4289'}
    #下面一条日志是LOG.info()显示的内容
    [2019-07-03 10:24:29,485] INFO in views: [(Driver name: websocket, age: 25 telephone:156****4289, Driver's avatar is telephone:156****4289, avatar:/home/nvidia/Public/avicii-02.png, type:0)]  
    [2019-07-03 14:32:43,402] DEBUG in views: ()
    2019-07-03 10:24:29,485 INFO sqlalchemy.engine.base.Engine ROLLBACK
    127.0.0.1 - - [03/Jul/2019 10:24:29] "GET /driver/detail/156****4289 HTTP/1.1" 200 -

    倒数第二条日志,返回数据给请求的时候,为什么回滚了呢?是我代码少写了什么吗?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 在使用 Flask SQLAlchemy 进行数据库操作时,如果查询结果为空或获取不到数据,可能会导致应用在执行查询时无法正常工作,因为 SQLAlchemy 的查询不会自动回滚,因此需要手动对查询结果进行回滚操作。

      以下是一个简单的示例,展示如何在 Flask 中在查询结果为空时进行回滚:

      ```python from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy

      app = Flask(name) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' db = SQLAlchemy(app)

      class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), nullable=False) email = db.Column(db.String(120), nullable=False)

      def __repr__(self):
          return f'<User {self.name}>'
      

      @app.route('/user', methods=['GET']) def get_user(): if not User.query.all(): return jsonify({'error': 'User not found'}), 404

      user = User.query.get(request.args.get('id'))
      if user is None:
          return jsonify({'error': 'User not found'}), 404
      
      return jsonify({'user': user})
      

      if name == 'main': db.create_all() app.run(debug=True) ```

      在这个示例中,我们首先创建了一个名为 User 的模型,并在数据库中创建了一个名为 example.db 的 SQLite 数据库。然后,我们在 /user 页面定义了一个路由,该路由接受一个参数 id,表示要获取的用户 ID。

      在路由函数中,我们首先检查用户模型中是否存在所有的用户。如果不存在,我们返回一个 JSON 序列,包含 error'User not found' 的信息,并返回 404 错误代码。如果存在所有用户,我们使用 query.get(request.args.get('id')) 从数据库中获取用户 ID,并返回一个 JSON 序列,包含用户信息。

      在查询结果为空时,由于 SQLAlchemy 会自动执行 User.query.get(request.args.get('id')) 语句,并返回查询结果,因此在返回结果时,我们使用 jsonify({'error': 'User not found'}), 404 作为响应。这样,即使查询结果为空,我们也能在渲染结果时将查询结果的错误信息显示给用户,避免应用在执行查询时出现意外错误。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部