我有一个通过Flask-SQLAlchemy与MySQL db交互的Flask项目。我的问题是,如何根据一个值或另一个值从数据库中选择一行。
Flask-SQLAlchemy
MySQL
SELECT id FROM users WHERE email=email OR name=name;
如何在Flask-SQLAlchemy中实现这一点?
odopli941#
以下内容可能会有所帮助:
# app.py from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'url_or_path/to/database' db = SQLAlchemy(app) class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(50), unique=True) name = db.Column(db.String(30)) def __init__(self, name=None, email=None): if not name: raise ValueError('\'name\' cannot be None') if not email: raise ValueError('\'email\' cannot be None') self.name = name self.email = email class UserQuery(object): @staticmethod def get_user_id_by_email_or_name(email=None, name=None): user = User.query.filter((User.email == email) | (User.name == name)).first() return user.id if hasattr(user, 'id') else None
这个“|“”可以在筛选器内代替"“or_”“使用。请参见Using OR in SQLAlchemy。”“您可以像这样使用:
>>> from app import db, User, UserQuery >>> db.create_all() >>> user = User(name='stan', email='stan@email.com') >>> db.session.add(user) >>> db.session.commit() >>> by_name_id = UserQuery.get_user_id_by_email_or_name(name='stan') >>> by_email_id = UserQuery.get_user_id_by_email_or_name(email='stan@email.com') >>> by_name_id == by_email_id True
fae0ux8s2#
我今天也需要这个案例,我找到了很好的答案here:因此,我们可以像下面的例子一样创建OR逻辑:
from sqlalchemy import or_ db.session.query(User).filter(or_(User.email=='useremail@example.com', User.name=="username")).first()
使用filter()表达式时,必须使用正确的比较运算符,而filter_by()使用的是缩短的非Python形式。
filter()
filter_by()
kpbpu0083#
我还希望具有or沿着and条件我在谷歌上搜索了一下后发现了这个:
or
and
# Users whose age is 23 AND (firstname IS alex OR lastname IS watson) usrs = session.query(User) \ .filter(User.age === "23") \ .filter((User.firstname == 'alex') | (User.lastname == 'watson')) \ .all()
希望能帮助其他来这里寻找它的人
nue99wik4#
刚刚注意到,它不允许将filter_by与'|'条件,至少在python 2.x中是这样。您将看到“SyntaxError:语法”“无效。例如:
Rule.query.filter_by((is_active=True) | (id=rule_id))
4条答案
按热度按时间odopli941#
以下内容可能会有所帮助:
这个“|“”可以在筛选器内代替"“or_”“使用。请参见Using OR in SQLAlchemy。”“
您可以像这样使用:
fae0ux8s2#
我今天也需要这个案例,我找到了很好的答案here:
因此,我们可以像下面的例子一样创建OR逻辑:
使用
filter()
表达式时,必须使用正确的比较运算符,而filter_by()
使用的是缩短的非Python形式。kpbpu0083#
我还希望具有
or
沿着and
条件我在谷歌上搜索了一下后发现了这个:
希望能帮助其他来这里寻找它的人
nue99wik4#
刚刚注意到,它不允许将filter_by与'|'条件,至少在python 2.x中是这样。您将看到“SyntaxError:语法”“无效。例如: