Python SQLAlchemy在连接和限制时按表达式顺序生成错误的SQL
我有一个重复错误的应用程序 错误的简短描述:SQLAlchemy使用子查询,但忽略按表达式顺序排列的子查询别名 型号:Python SQLAlchemy在连接和限制时按表达式顺序生成错误的SQL,python,sql,orm,sqlalchemy,flask-sqlalchemy,Python,Sql,Orm,Sqlalchemy,Flask Sqlalchemy,我有一个重复错误的应用程序 错误的简短描述:SQLAlchemy使用子查询,但忽略按表达式顺序排列的子查询别名 型号: from flask.ext.sqlalchemy import SQLAlchemy db = SQLAlchemy() class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String)
class Genre(db.Model):
__tablename__ = 'genres'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
class Magazine(db.Model):
__tablename__ = 'magazines'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
genre_id = db.Column(db.Integer, db.ForeignKey('genres.id'))
author = db.relationship(User,
backref=db.backref('magazines',
order_by=id,
lazy='joined'))
genre = db.relationship(Genre,
backref=db.backref('magazines',
order_by=id,
lazy='joined'))
class WorkType(db.Model):
__tablename__ = 'work_types'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
class WorkEvent(db.Model):
__tablename__ = 'work_events'
id = db.Column(db.Integer, primary_key=True)
start_date = db.Column(db.DateTime, nullable=False)
end_date = db.Column(db.DateTime, nullable=False)
work_type_id = db.Column(db.Integer, db.ForeignKey('work_types.id'))
work_type = db.relationship(WorkType,
backref=db.backref('work_events'), order_by=id,
lazy='joined')
class AuthorRate(db.Model):
__tablename__ = 'author_rates'
id = db.Column(db.Integer, primary_key=True)
amount = db.Column(db.Float, nullable=False)
work_type_id = db.Column(db.Integer, db.ForeignKey('work_types.id'))
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
work_type = db.relationship(WorkType,
backref=db.backref('author_rates'), order_by=id,
lazy='joined')
author = db.relationship(User,
backref=db.backref('author_rates'),
order_by=id, lazy='joined')
观点:
@app.route('/')
def index():
for i in range(5):
some_key = str(random.randint(1000000, 9000000))
work_type = WorkType(name='work_type' + some_key)
db.session.add(work_type)
for j in range(8):
some_other_key = str(random.randint(1000000, 9000000))
user = User(username='user' + some_key + some_other_key)
db.session.add(user)
rate = AuthorRate(
amount=1 + random.random(),
work_type=work_type,
author=user)
db.session.add(rate)
db.session.commit()
print('========')
rates = AuthorRate.query
print(rates)
rates = rates.limit(10)
print('+++++++')
print(rates)
print('=========')
rates = rates.offset(0)
return render_template('limit.html', rates=rates)
模板:
{% for rate in rates %}
<p>{{ rate.id }} - {{ rate.amount }} - {{ rate.work_type }} - {{ rate.author }}</p>
{% endfor %}
错误:
ProgrammingError:(psycopg2.ProgrammingError)在表“author_rates”的子句条目中丢失
第4行:…\u 1 ON users\u 1.id=杂志\u 1.author\u id按作者排序
其他订单应为:
ORDER BY anon_1.author_rates_id, magazines_1.id;
问题:是否有解决方法
环境:
ubuntu 14.04、python 2.7、SQLAlchemy 1.0.8、SQLAlchemy 2.0、SQLAlchemy 0.10.1
p.s.模型可能看起来有点奇怪,这是因为问题的根源是在封闭源代码的应用程序中,我没有足够的想象力来编写好的概念证明
ORDER BY anon_1.author_rates_id, magazines_1.id;