Python 2.7 如何在sqlalchemy中生成这个sql,我正在努力,但不知道该怎么做
选择pck.id、pck.name、deb.last_time from select id、name from dp_package其中name(如%s limit%s,%s as pck left join select package_id)、last_time from dp_deb其中id在select maxid from dp_deb group by package_id as deb on pck.id=deb.package_id%关键字、开始、限制假设定义了模型: Base=声明性的\u BasePython 2.7 如何在sqlalchemy中生成这个sql,我正在努力,但不知道该怎么做,python-2.7,sqlalchemy,Python 2.7,Sqlalchemy,选择pck.id、pck.name、deb.last_time from select id、name from dp_package其中name(如%s limit%s,%s as pck left join select package_id)、last_time from dp_deb其中id在select maxid from dp_deb group by package_id as deb on pck.id=deb.package_id%关键字、开始、限制假设定义了模型: Base
class Package(Base):
__tablename__ = 'db_package'
id = Column(Integer, primary_key=True)
name = Column(String)
def __init__(self, name):
self.name = name
class Deb(Base):
__tablename__ = 'db_deb'
id = Column(Integer, primary_key=True)
package_id = Column(Integer, ForeignKey('db_package.id'))
name = Column(String)
last_time = Column(DateTime)
def __init__(self, name, last_time):
self.name = name
self.last_time = last_time
packages = relationship(Package, backref="debs")
下面的代码应生成相同的结果,尽管SQL查询不同,其中一个子查询替换为简单的左外联接:
为SQLite生成此SQL:
# query parameters
keyword, start, limit = 'xxx', 1, 3
# subquery for the last_time
sq2h = session.query(Deb.package_id, func.max(Deb.id).label("max_id")).group_by(Deb.id).subquery("max_deb")
sq2 = (session.query(Deb.package_id, Deb.last_time).
join(sq2h, Deb.id == sq2h.c.max_id))
sq2 = sq2.subquery("deb")
qry = (session.query(Package.id, Package.name, sq2.c.last_time).
outerjoin(sq2, sq2.c.package_id == Package.id).
filter(Package.name.contains(keyword))
)[start:(start + limit)]
print qry
SELECT db_package.id AS db_package_id,
db_package.name AS db_package_name,
deb.last_time AS deb_last_time
FROM db_package
LEFT OUTER JOIN(SELECT db_deb.package_id AS package_id, db_deb.last_time AS last_time
FROM db_deb
JOIN (SELECT db_deb.package_id AS package_id,
max(db_deb.id) AS max_id
FROM db_deb
GROUP BY db_deb.id
) AS max_deb
ON db_deb.id = max_deb.max_id
) AS deb
ON deb.package_id = db_package.id
WHERE db_package.name LIKE '%%' || ? || '%%'
LIMIT ? OFFSET ?
('xxx', 3, 1)