【问题标题】:Flask-peewee to Flask-sqlalchemy - Operand should contain 1 column(s)Flask-peewee 到 Flask-sqlalchemy - 操作数应包含 1 列
【发布时间】:2017-02-16 22:57:00
【问题描述】:

我遇到了这个错误操作数应该包含 1 列的问题,我知道它们是子查询中的两个字段,但是从我的代码和使用 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)]

【问题讨论】:

  • 什么是self.following()
  • 它是我的用户模型中的一个函数,它返回像 twitter 这样的用户之后的用户,它所做的只是传递该位下的两个查询是内容,以及当我使用 peewee 和其他现在我正在转换为 sqlalchemy
  • 如果您不介意我的询问,您为什么要从 flask-peewee 切换到 flask-sqlalchemy? :)

标签: python mysql flask-sqlalchemy flask-peewee


【解决方案1】:

OperationalError: (_mysql_exceptions.OperationalError) (1241, '操作数 应包含 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()是多列值。

【讨论】:

  • 刚刚尝试过,我收到一些关于基本查询没有 id 属性的错误
  • 啊,我现在看到问题了,我忘记了&lt;&lt; 在使用 peewee 时是和 IN,不少于。 in_() 函数会是我在这里使用的函数吗?调用它后我仍然会收到 id 属性错误。无论如何,这不是我应该寻找的 id,只是将其更改为普通用户名,现在得到一个未实现的错误。感谢您的帮助
【解决方案2】:

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

老实说,如果您遇到了您认为是 Peewee 中的错误,或者发现事情过于困难或不直观,那么对于我作为维护者来说,这正是最有用的反馈。当然,很高兴听到人们说“Peewee 很棒,谢谢”,但最终离开的人通常最有话要说。

请停下来留下评论 https://github.com/coleifer/peewee/issues/new 或联系我 http://charlesleifer.com/contact/ -- 我将非常感谢您抽出几分钟的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2023-03-29
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多