Flask-peewee到Flask-sqlalchemy -操作数应该包含1列



我遇到了这个错误操作数应该包含1列(s)的问题,我得到的是关于它们在子查询中的两个字段,但从我的代码和使用flask-sqlalchemy我无法找出出了什么问题。我正在将我的应用程序从flask-peewee转换为flask-sqlalchemy,这是我无法解决的一个问题。

这里是主查询代码,第一个是我的新sql-alchemy查询,另一个是peewee查询。

//SqlAlchmey
return UserBeer.query.filter(or_( UserBeer.id < self.following(), UserBeer.username == self)).order_by(UserBeer.tried_date.desc()).limit(5)
//Peewee Query
return UserBeer.select(Beer, UserBeer).join(Beer).where(
            (UserBeer.username << self.following()) |
            (UserBeer.username == self)).order_by(UserBeer.tried_date.desc()).limit(5)

导致问题的查询部分是对self.following()的调用,如果我删除sqlalchemy查询工作,这里是该查询的代码下面是self.following()的内容

// SQLAlchmey
return Relationship.query.filter(Relationship.from_user == self)
//Peewee
return ( User.select().join(Relationship, on=Relationship.to_user).where(Relationship.from_user == self))

我知道第二个查询我要求两个不同的东西,但似乎你在SQLAlchemy中声明模型中的关系,这里是关系模型,我认为这是正确的,但不确定。此外,我的用户模型不确定是否有什么缺失。

class Relationship(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    from_user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    to_user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    from_user = db.relationship('User', backref=db.backref('relationships', lazy='joined'), foreign_keys=from_user_id)
    to_user = db.relationship('User', backref=db.backref('related_to', lazy='joined'), foreign_keys=to_user_id)
class User(UserMixin, db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(), unique=True)
    email = db.Column(db.String(), unique=True)
    bio = db.Column(db.String(160))
    password = db.Column(db.String(200))
    joined_at = db.Column(db.DateTime(), default=datetime.datetime.now)
    is_admin = db.Column(db.Boolean(), default=False)
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))

编辑当我再看一遍的时候,我想整个错误可能是有用的

OperationalError: (_mysql_exceptions.OperationalError) (1241, 'Operand should contain 1 column(s)') [SQL: u'SELECT user_beer.id AS user_beer_id, user_beer.username_id AS user_beer_username_id, user_beer.beer_id AS user_beer_beer_id, user_beer.rating AS user_beer_rating, user_beer.description AS user_beer_description, user_beer.recommend AS user_beer_recommend, user_beer.tried_date AS user_beer_tried_date nFROM user_beer nWHERE user_beer.id < (SELECT relationship.id AS relationship_id, relationship.from_user_id AS relationship_from_user_id, relationship.to_user_id AS relationship_to_user_id nFROM relationship nWHERE %s = relationship.from_user_id) OR %s = user_beer.username_id ORDER BY user_beer.tried_date DESC n LIMIT %s'] [parameters: (1L, 1L, 5)]

OperationalError: (_mysql_exceptions.OperationalError) (1241, 'Operand . '应该包含1列')

告诉您,您正在尝试将一个列列表与一个用户id列进行比较。

return UserBeer.query.filter(or_( UserBeer.id < self.following(), UserBeer.username == self)).order_by(UserBeer.tried_date.desc()).limit(5)
上面代码中的

UserBeer.id为单列值,self.following()为多列值。

从Peewee切换到SQLAlchemy?你到底为什么要做这样的事!

老实说,如果你在Peewee中遇到了你认为的bug,或者发现一些过于困难或不直观的东西,这正是我作为维护者最有用的反馈。当然,听到人们说"Peewee很好,谢谢"是件好事,但最终离开的人通常最有话要说。

请顺便留下评论https://github.com/coleifer/peewee/issues/new或在http://charlesleifer.com/contact/联系我——我将非常感谢你哪怕几分钟的时间

最新更新