On 11/18/2016 02:08 PM, Paul Giralt wrote:
I'm having trouble figuring out how to accomplish this task using
SQLAlchemy. Basically I have a table that maps a user's skill levels as
follows:

class Skillmap(db.Model):
    __tablename__ = 'skillmap'
    id = db.Column(db.UUID(), primary_key=True)
    user_id = db.Column(db.UUID(), db.ForeignKey('user.id'))
    skill_id = db.Column(db.UUID(), db.ForeignKey('skill.id'))
    level_id = db.Column(db.UUID(), db.ForeignKey('level.id'))
    timestamp = db.Column(db.DateTime, default=datetime.utcnow(),
onupdate=datetime.utcnow())

A particular user will be associated with a variety of skills and those
skills are at a certain level (say 1 - 10 for simplicity).

So for example, I could insert into the DB an entry that says:

user1   skill1    level 5    timestamp 1
user1   skill2    level 4    timestamp 2
user1   skill3    level 7    timestamp 3

then later on, the user updates their skill:

user1   skill1    level 10    timestamp 4
user1   skill2    level 10    timestamp 5

When the user updates the skill, I don't update the DB record, Rather, I
insert a new record into the DB so that I can store the history of the
skill level over time.

When I want to query for the current skill levels for a user (latest
timestamp), I want to get back the latest entries for any given skill.
In other words, for the above example I'd like to get the results:

user1   skill1    level 10    timestamp 4
user1   skill2    level 10    timestamp 5
user1   skill3    level 7      timestamp 3

I've tried playing around with func.max() but I haven't been able to get
it to do what I want.

I found this article that describes a solution for a similar question
but the solution is just SQL syntax:

http://stackoverflow.com/questions/612231/how-can-i-select-rows-with-maxcolumn-value-distinct-by-another-column-in-sql

Is there an easy way to accomplish this using SQLAlchemy? Any help would
be greatly appreciated.


this style of query is common and a query of similar form is illustrated here:

https://docs.sqlalchemy.org/en/latest/orm/tutorial.html#using-subqueries

the query in the SO answer would look like:

subq = s.query(
  topten.home,
  func.max(topten.datetime).label("maxdatetime")
).group_by(topten.home).subquery("groupedtt")

q = s.query(TT).join(
   subq,
   and_(
      TT.home == subq.c.home, TT.datetime == subq.c.maxdatetime))









--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and
Verifiable Example. See http://stackoverflow.com/help/mcve for a full
description.
---
You received this message because you are subscribed to the Google
Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

--
SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to