flask web开发遇到sqlalchemy 查询为None怎么解决

如题所述

  讲数据库操作了

  创建表

  首先,我们要让Flask-SQLAlchemy 根据模型类创建数据库。方法是使用db.create_all()

  函数:

  (venv) $ python hello.py shell

  >>> from hello import db

  >>> db.create_all()

  插入行

  下面这段代码创建了一些角色和用户:

  >>> from hello import Role, User

  >>> admin_role = Role(name='Admin')

  >>> mod_role = Role(name='Moderator')

  >>> user_role = Role(name='User')

  >>> user_john = User(username='john', role=admin_role) #User类虽然没有role属性,但是在上一章节里面的Role里面设置了一个backref属性,就是用来反向作用的。

  >>> user_susan = User(username='susan', role=user_role) #注意啊,这里的role=user_role针对的是上一章节里面说的,对应的是模型对象!不是键的值!!!

  >>> user_david = User(username='david', role=user_role)

  模型的构造函数接受的参数是使用关键字参数指定的模型属性初始值。注意,role 属性也可使用,虽然它不是真正的数据库列,但却是一对多关系的高级表示。这些新建对象的id属性并没有明确设定,因为主键是由Flask-SQLAlchemy 管理的。现在这些对象只存在于Python 中,还未写入数据库。因此id 尚未赋值:

  >>> print(admin_role.id)

  None

  >>> print(mod_role.id)

  None

  >>> print(user_role.id)

  None

  通过数据库会话管理对数据库所做的改动,在Flask-SQLAlchemy 中,会话由db.session表示。准备把对象写入数据库之前,先要将其添加到会话中:

  >>> db.session.add(admin_role)

  >>> db.session.add(mod_role)

  >>> db.session.add(user_role)

  >>> db.session.add(user_john)

  >>> db.session.add(user_susan)

  >>> db.session.add(user_david)

  或者简写成

  db.session.add_all([admin_role, mod_role, user_role,

  ... user_john, user_susan, user_david])

  这里的session首先是和前面章节讲的HTTP里面的session不一样的

  不过我感觉作用是类似的,相当于一个缓存的作用,把实例化生成的对象存放在session里面

  最后通过commit命令执行保存在数据库内。

  db.session.commit()

  接着,再去查看属性,已经有了

  >>> print(admin_role.id)

  1

  >>> print(mod_role.id)

  2

  >>> print(user_role.id)

  3

  修改行

  在数据库会话上调用add() 方法也能更新模型。我们继续在之前的shell 会话中进行操作,下面这个例子把"Admin" 角色重命名为"Administrator":

  >>> admin_role.name = 'Administrator'

  >>> db.session.add(admin_role)

  >>> db.session.commit()

  删除行

  数据库会话还有个delete() 方法。下面这个例子把"Moderator" 角色从数据库中删除:

  >>> db.session.delete(mod_role)

  >>> db.session.commit()

  查询行

  Flask-SQLAlchemy 为每个模型类都提供了query 对象。最基本的模型查询是取回对应表中

  的所有记录:

  >>> Role.query.all()

  [<Role u'Administrator'>, <Role u'User'>]

  >>> User.query.all()

  [<User u'john'>, <User u'susan'>, <User u'david'>]

  使用过滤器可以配置query 对象进行更精确的数据库查询。下面这个例子查找角色为"User" 的所有用户:

  >>> User.query.filter_by(role=user_role).all()

  [<User u'susan'>, <User u'david'>]

  filter_by()等过滤器在query 对象上调用,返回一个更精确的query 对象。多个过滤器可以一起调用,直到获得所需结果。

  关系和查询的处理方式类似。下面这个例子分别从关系的两端查询角色和用户之间的一对多关系:

  >>> users = user_role.users

  >>> users

  [<User u'susan'>, <User u'david'>]

  >>> users[0].role

  <Role u'User'>

  这个例子中的user_role.users 查询有个小问题。执行user_role.users 表达式时,隐含的查询会调用all() 返回一个用户列表。query 对象是隐藏的,因此无法指定更精确的查询

  过滤器。就这个特定示例而言,返回一个按照字母顺序排序的用户列表可能更好。在示例5-4 中,我们修改了关系的设置,加入了lazy = 'dynamic' 参数,从而禁止自动执行查询。

  示例5-4 hello.py:动态关系

  class Role(db.Model):

  # ...

  users = db.relationship('User', backref='role', lazy='dynamic')

  # ...

  这样配置关系之后,user_role.users 会返回一个尚未执行的查询,因此可以在其上添加过

  滤器:

  >>> user_role.users.order_by(User.username).all()

  [<User u'david'>, <User u'susan'>]

  >>> user_role.users.count()

  2

  我的理解是,通过添加lazy参数后,他生成的对象就是不直接显示内容,而是要通过过滤器才能显示的。
温馨提示:内容为网友见解,仅供参考
无其他回答

Python Web | Flask使用Flask-SQLAlchemy对数据库操作详解二(增删改...
数据库操作详解1. 增加数据Flask-SQLAlchemy中,你可以使用add()方法添加新数据,或者利用create()方法创建完整的数据对象。2. 查询数据查询数据是通过db.session.query()方法实现的,支持多种操作,如查询所有记录、条件查询、排序和分页。3. 更新数据修改数据时,通过commit()方法提交db.session对象的更...

Python Web | Flask使用Flask-SQLAlchemy对数据库操作详解一(配置...
首先,通过简单的配置和模型声明,我们可以使用Base类创建表示数据库表的类。例如,User表有id、username和email字段,其中id为主键,其他字段为唯一且非空字符串。Flask-SQLAlchemy支持多种列类型,如定义为Integer或String。在关系处理方面,一对一关系如User和Address,定义为User.address = relationship(A...

盘点Flask与数据库的交互插件(Flask-Sqlalchemy)
安装与基本用法以MySQL为例,Flask-Sqlalchemy支持连接配置的多种方式,包括写在配置文件中、在应用中直接导入,甚至使用独特的引擎。通过配置文件,如"config.py",设置数据库连接参数。数据库操作- 连接数据库:可以创建不同数据库的连接,如People数据库,并指定表。- 数据表管理:通过继承`db.Model`...

在Flask-SQLAlchemy 中联表查询
报错的原因是 db.session.query 默认返回的是 orm.Query 对象,这个对象并不包含 paginate 方法。要解决这个问题,需要修改 Flask-SQLAlchemy 的源码。找到 SQLAlchemy 对象的 __init__ 定义,在其中加入 session_options['query_cls'] = BaseQuery 即可:在 Flask-SQLAlchemy 提供的 Mod...

flask-sqlalchemy如何连接现有数据库?
在Flask应用中,利用Flask-SQLAlchemy连接现有数据库并实现增删改查的基本操作是后端开发中常见的任务。首先,将模型定义移至`app.py`文件中,确保模型与路由函数、应用变量等紧密关联,以避免文件间的循环引用问题。接着,探讨了如何优化模型实例化过程,通过引入类方法实现Python字典到模型对象的转换,简化...

如何将 Flask SQLAlchemy amp;Peewee 的查询结果转换成 json
首先,最好用to_dict()或者dict这样的东西先把sqlalchemy的对象转换成python dict,然后再把python dict对象转换成json 其次,json能表示的数据能力比SQLALCHEMY要弱,很多python的类型没有直接对应的json格式,比如datetime.datetime类型,所以直接转换是可能会有问题的;所以即使你转换成了python dict,dict...

如何用flask实现一个web应用来显示在mysql数据库中查询到的内容_百度...
用 Flask-SQLAlchemy(SQLAlchemy ORM 模块的 Flask 定制版)。这个在定义 schema、连接数据库、增删改查方面都给你提供极大的便利。这个对象就包含 sqlalchemy 和 sqlalchemy.orm 中的所有函数和助手。此外它还提供一个名为 Model 的类,用于作为声明模型时的 delarative 基类:from flask import Flask ...

如何在flask-sqlalchemy查询最后一条记录
你的记录有什么特点吗?如果有id标识的话,或者其他的字段增加\/减少那么:selectmax(标识字段或增加字段)from表groupby标识字段selectmin(标识字段或减少字段)from表groupby标识字段或者用topselecttop1标识字段或增加字段from表orderby标识字段或增加字段desc或orderby标识字段或减少字段asc ...

sqlalchemy可以只查某一列吗
查询方法:User.query.with_entities(User.id,User.username,Department.department_name).join(User.dept).all()等价于:SELECT "user".id AS user_id, "user".username AS user_username, department.department_name AS department_department_name FROM "user" JOIN department ON department.id = ...

Python中强大的通用ORM框架:SQLAlchemy
SQLAlchemy不允许直接修改表结构,需要删除旧表重建或执行原生SQL ALERT TABLE。建议一次性设计表结构,避免后期改动。支持新增记录,可批量操作以提升性能。修改和删除记录功能也有所提供。查询功能丰富,包括基本查询、条件查询、范围查询、模糊匹配、分页和排序等。支持多表查询,可创建多表关系进行复杂查询。

相似回答