flask filter by中query.filter.first可不可以返回空对象

(飞翔的言)
(bamtd37473)
第三方登录:问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
有人能给我解释以下么,看不出又什么区别呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
用法不同而已,filter 可以像写 sql 的 where 条件那样写 & & 等条件,但引用列名时,需要通过 类名.属性名 的方式。 filter_by 可以使用 python 的正常参数传递方法传递条件,指定列名时,不需要额外指定类名。,参数名对应名类中的属性名,但似乎不能使用 & & 等条件。各有所长吧。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
感觉楼上的不是很对
filter指定列名的时候,可以不使用类名;filter_by也不是说任何时候都可以不指定类名
我平时使用的时候,两者区别主要就是当使用filter的时候条件之间是使用“==",fitler_by使用的是"="。
user1 = session.query(User).filter_by(id=1).first()
user1 = session.query(User).filter(id==1).first()
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App
SegmentFault
一起探索更多未知flask-sqlalchemy select count() [flask-sqlalchemy select count()] - 问题-字节技术
flask-sqlalchemy select count()
flask-sqlalchemy select count()
问题 (Question)
i have query like this
query = Notification.query(db.func.count(Notification.id))
query = query.filter(Notification.read == False)
query = query.filter(Notification.id == recv_id)
return query.all()
and i got error like this
query = Notification.query(db.func.count(Notification.id))
TypeError: 'BaseQuery' object is not callable
please help, thanks
我有这样的查询query = Notification.query(db.func.count(Notification.id))
query = query.filter(Notification.read == False)
query = query.filter(Notification.id == recv_id)
return query.all()
我得到了这样的错误查询= Notification.query(db.func.count(Notification.id))TypeError:BaseQuery的对象不是可调用的请帮助,谢谢
最佳答案 (Best Answer)
Your first line raises the error. query is an instance of BaseQuery and its not callable.
What you are trying to do is similar to:
class A(object):
a_obj = A()
print a_obj()
You can't call an instance.
You should call some method on the instance.
Not sure why you require the first line in your code.
You can do something like:
Notification.query.filter(Notification.read == False)
你的第一行提高了错误。query是BaseQuery及其不调用一个实例。你正在试图做的是类似于:class A(object):
a_obj = A()
print a_obj()
本文翻译自StackoverFlow,英语好的童鞋可直接参考原文:老徐_kevin 的BLOG
用户名:老徐_kevin
文章数:140
评论数:560
访问量:344027
注册日期:
阅读量:5863
阅读量:12276
阅读量:349358
阅读量:1048423
51CTO推荐博文
& &之前那篇文章是flask+redis的,如果用flask+mysql怎么实现呢?创建数据库:CREATE&DATABASE&`web12306`&&DEFAULT&CHARACTER&SET&utf8;创建表:CREATE&TABLE&`web12306`&(
&&`user_email`&varchar(100)&NOT&NULL&DEFAULT&'',
&&`user_pass`&varchar(100)&NOT&NULL&DEFAULT&'',
&&`user_name`&varchar(100)&NOT&NULL&DEFAULT&'',
&&`user_id`&varchar(100)&NOT&NULL&DEFAULT&'',
&&`user_nic`&varchar(100)&NOT&NULL&DEFAULT&'',
&&`user_phone`&varchar(100)&NOT&NULL&DEFAULT&''
)&ENGINE=InnoDB&DEFAULT&CHARSET=utf8;导入数据,数据文件还是result.txt,同样的格式。mysql&-uroot&-pmysql@123&-e&'load&data&local&infile&"result.txt"&into&table&web12306.web12306&fields&terminated&by&"---"&lines&terminated&by&"\n";'查看数据导入情况:数据有了,剩下还是上python代码了,使用mysql时,需要用到sqlalchemy#&-*-&coding:&utf-8&-*-
from&flask&import&Flask,&request,&render_template,&jsonify,&json
from&flask.ext.sqlalchemy&import&SQLAlchemy
app&=&Flask(__name__)
db&=&SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI']&=&'mysql://root:mysql@123@localhost/web12306'
class&session(db.Model):
&&__tablename__&=&'web12306'
&&user_id&=&db.Column(db.String(100),&primary_key&=&True)
&&user_email&=&db.Column(db.String(100))
&&user_pass&=&db.Column(db.String(100))
&&user_nic&=&db.Column(db.String(100))
&&user_phone&=&db.Column(db.String(100))
&&user_name&=&db.Column(db.String(100))
@app.route('/scan/&user_id&',&methods=['GET'])
def&scan(user_id):
&&&&&result&=&session.query.filter_by(user_id=user_id).first()
&&&&&if&result&is&None:
&&&&&&&&&&&&json_result={'user_id':None}
&&&&&&&&&&&&return&json.dumps(json_result,ensure_ascii=False)
&&&&&else:
&&&&&&&&&&&&json_result&=&{'user_id':&result.user_id,&'user_email':&result.user_email,&'user_pass':&result.user_pass,&'user_nic':&result.user_nic,&'user_phone':&result.user_phone,&'user_name':&result.user_name}
&&&&&&&&&&&&return&json.dumps(json_result,ensure_ascii=False)
&&&&&&&&&&&&
&&&&&&&&&&&&
@app.route('/')
def&index():
&&&&return&render_template('index.html')
if&__name__&==&'__main__':
&&app.run(host='0.0.0.0',&port&=&8080,&debug=True)前端代码请看上一篇文字。本文出自 “” 博客,谢绝转载!
了这篇文章
类别:┆阅读(0)┆评论(0)flask学习笔记(-数据库)
Python 数据库框架
大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包。Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL、Postgres、SQLite、Redis、MongoDB 或者 CouchDB。
如果这些都无法满足需求,还有一些数据库抽象层代码包供选择,例如SQLAlchemy和MongoEngine。你可以使用这些抽象包直接处理高等级的 Python 对象,而不用处理如表、文档或查询语言此类的数据库实体。
选择数据库框架的因素:
易用性。抽象层,也称为对象关系映 射(Object-Relational Mapper,ORM) 或 对 象 文 档 映 射(Object-Document Mapper,ODM),在用户不知觉的情况下把高层的面向对象操作转换成低层的数据库指令。 性能。ORM 和 ODM 把对象业务转换成数据库业务会有一定的损耗。真正的关键点在于如何选择一个能直接操作低层数据库的抽象层,以防特定的操作需要直接使用数据库原生指令优化。 可移植性。必须考虑其是否能在你的开发平台和生产平台中使用。 Flask集成度
pip install flask-sqlalchemy
使用URL制定数据库
数据库引擎
mysql://username:password@hostname/database
postgresql://username:password@hostname/database
SQLite(Unix)
sqlite:////absolute/path/to/database
SQLite(Windows)
sqlite:///c:/absolute/path/to/database
SQLite 数 据 库 不 需 要 使 用 服 务 器, 因 此 不 用 指 定 hostname 、 username 和 password 。URL 中的 database 是硬盘上文件的文件名。
程序使用的数据库 URL 必须保存到 Flask 配置对象的 SQLALCHEMY_DATABASE_URI 键中
配置对象中还有一个很有用的选项,即 SQLALCHEMY_COMMIT_ON_TEARDOWN 键,将其设为 True时,每次请求结束后都会自动提交数据库中的变动
from flask.ext.sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQLAlchemy(app)
class Role(db.Model):
__tablename__ = 'roles'#__tablename__ 定义在数据库中使用的表名
id = db.Column(db.Integer, primary_key=True)#primary_key如果设为 True ,这列就是表的主键.如果没有定义 __tablename__ ,SQLAlchemy 会使用一个默认名字
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '' % self.name
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
def __repr__(self):
return '' % self.username
最常用的SQLAlchemy列类型
Python类型
普通整数,一般是 32 位
SmallInteger
取值范围小的整数,一般是 16 位
BigInteger
int 或 long
不限制精度的整数
decimal.Decimal
变长字符串
变长字符串,对较长或不限长度的字符串做了优化
变长 Unicode 字符串
UnicodeText
变长 Unicode 字符串,对较长或不限长度的字符串做了优化
datetime.date
datetime.time
datetime.datetime
日期和时间
datetime.timedelta
一组字符串
PickleType
任何 Python 对象
自动使用 Pickle 序列化
LargeBinary
二进制文件
最常使用的SQLAlchemy列选项
primary_key
如果设为 True ,这列就是表的主键
如果设为 True ,这列不允许出现重复的值
如果设为 True ,为这列创建索引,提升查询效率
如果设为 True ,这列允许使用空值;如果设为 False ,这列不允许使用空值
为这列定义默认值
关系型数据库使用关系把不同表中的行联系起来。
class Role(db.Model):
users = db.relationship('User', backref='role')#添加到 Role 模型中的 users 属性代表这个关系的面向对象视角。对于一个 Role 类的实例,其 users 属性将返回与角色相关联的用户组成的列表。db.relationship() 的第一个参数表,如果模型类尚未定义,可使用字符串形式指定。db.relationship() 中的 backref 参数向 User 模型中添加一个 role 属性,从而定义反向关系。这一属性可替代 role_id 访问 Role 模型,此时获取的是模型对象
class User(db.Model):
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))#关系使用 users 表中的外键连接了两行。添加到 User 模型中的 role_id 列被定义为外键,就是这个外键建立起了关系。传给 db.ForeignKey() 的参数 'roles.id' 表明,这列的值是 roles 表中行的 id 值。
db.relationship() 都能自行找到关系中的外键,但有时却无法决定把哪一列作为外键。如果 User 模型中有两个或以上的列定义为 Role 模型的外键,SQLAlchemy 就不知道该使用哪列。如果无法决定外键,你就要为 db.relationship() 提供额外参数,从而确定所用外键
常用的SQLAlchemy关系选项
在关系的另一个模型中添加反向引用
primaryjoin
明确指定两个模型之间使用的联结条件。只在模棱两可的关系中需要指定
指定如何加载相关记录。可选值有 select (首次访问时按需加载)、 immediate (源对象加载后就加载)、 joined (加载记录,但使用联结)、 subquery (立即加载,但使用子查询),noload (永不加载)和 dynamic (不加载记录,但提供加载记录的查询)
如果设为 Fales ,不使用列表,而使用标量值
指定关系中记录的排序方式
指定 多对多 关系中关系表的名字
secondaryjoin
SQLAlchemy 无法自行决定时,指定多对多关系中的二级联结条件
一对一关系可以用前面介绍的一对多关系表示,但调用 db.relationship() 时要把 uselist 设为 False ,把&多&变成&一&。
tags = db.Table('tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
class Page(db.Model):
id = db.Column(db.Integer, primary_key=True)
tags = db.relationship('Tag', secondary=tags,
backref=db.backref('pages', lazy='dynamic'))
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
数据库操作
python hello.py shell
&&& from hello import db
&&& db.create_all()
db.drop_all()
#创建对象,模型的构造函数接受的参数是使用关键字参数指定的模型属性初始值。
admin_role = Role(name='Admin')
user_role = Role(name='User')
user_susan = User(username='susan', role=user_role)#role 属性也可使用,虽然它不是真正的数据库列,但却是一对多关系的高级表示。
user_john = User(username='john', role=admin_role)
#这些新建对象的 id 属性并没有明确设定,因为主键是由 Flask-SQLAlchemy 管理的。
print(admin_role.id)#None
#通过数据库会话管理对数据库所做的改动,在 Flask-SQLAlchemy 中,会话由 db.session 表示。
##首先,将对象添加到会话中
db.session.add(admin_role)
db.session.add(user_role)
db.session.add(user_susan)
db.session.add(user_john)
#简写:db.session.add_all([admin_role, user_role, user_john, user_susan])
##通过提交会话(事务),将对象写入数据库
会话提交:
数据库会话能保证数据库的一致性。提交操作使用原子方式把会话中的对象全部写入数据库。如果在写入会话的过程中发生了错误,整个会话都会失效。
数据库会话也可 回滚 。调用 db.session.rollback() 后,添加到数据库会话中的所有对象都会还原到它们在数据库时的状态。
admin_role.name = 'Administrator'
db.session.add(admin_role)
db.session.delete(mod_role)
查询全部。Role.query.all() 条件查询(使用过滤器)。User.query.filter_by(role=user_role).all()
user_role = Role.query.filter_by(name='User').first()#filter_by() 等过滤器在 query 对象上调用,返回一个更精确的 query 对象。
常用过滤器
把过滤器添加到原查询上,返回一个新查询
filter_by()
把等值过滤器添加到原查询上,返回一个新查询
使用指定的值限制原查询返回的结果数量,返回一个新查询
偏移原查询返回的结果,返回一个新查询
order_by()
根据指定条件对原查询结果进行排序,返回一个新查询
group_by()
根据指定条件对原查询结果进行分组,返回一个新查询
最常使用的SQLAlchemy查询执行函数
以列表形式返回查询的所有结果
返回查询的第一个结果,如果没有结果,则返回 None
first_or_404()
返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误响应
返回指定主键对应的行,如果没有对应的行,则返回 None
get_or_404()
返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误响应
返回查询结果的数量
paginate()
返回一个 Paginate 对象,它包含指定范围内的结果
#执行 user_role.users 表达式时,隐含的查询会调用 all() 返回一个用户列表。 query 对象是隐藏的,因此无法指定更精确的查询过滤器。
users = user_role.users
#修改了关系的设置,加入了 lazy = 'dynamic' 参数,从而禁止自动执行查询
class Role(db.Model):
users = db.relationship('User', backref='role', lazy='dynamic')
user_role.users.order_by(User.username).all()
在视图函数中操作数据库
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.name.data).first()
if user is None:
user = User(username = form.name.data)
db.session.add(user)
session['known'] = False
session['known'] = True
session['name'] = form.name.data
form.name.data = ''
return redirect(url_for('index'))
return render_template('index.html', form = form, name = session.get('name'), known = session.get('known', False))
{ % extends &base.html& % }
{ % import &bootstrap/wtf.html& as wtf % }
{ % block title % }Flasky{ % endblock % }
{ % block page_content % }
Hello, { % if name % }{{ name }}{ % else % }Stranger{ % endif % }!
{ % if not known % }
Pleased to meet you!
{ % else % }
Happy to see you again!
{ % endif % } {{ wtf.quick_form(form) }} { % endblock % }
集成 Python shell
让 Flask-Script 的 shell 命令自动导入特定的对象
from flask.ext.script import Shell
def make_shell_context():
return dict(app=app, db=db, User=User, Role=Role)
manager.add_command(&shell&, Shell(make_context=make_shell_context))
make_shell_context() 函数注册了程序、数据库实例以及模型,因此这些对象能直接导入 shell
使用 Flask-Migrate 实现数据库迁移
创建迁移仓库
pip install flask-migrate
from flask.ext.migrate import Migrate, MigrateCommand
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)
在维护数据库迁移之前,要使用 init 子命令创建迁移仓库
python hello.py db init
创建迁移脚本
python hello.py db migrate -m &initial migration&
更新数据库
python hello.py db upgrade
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 flask filter by 的文章

 

随机推荐