2013-09-29 36 views
0

以下是我与工作模式:SQL炼金术查询过滤器语法不工作

class User(db.Model): 
__tablename__ = 'user' 
uid = db.Column(db.Integer, primary_key=True, index=True) 
firstName = db.Column(db.String(100)) 
lastName = db.Column(db.String(100)) 
emailAddress = db.Column(db.String(120), unique=True, index=True) 
pwHash = db.Column(db.String(256)) 
userLevel = db.Column(db.Integer()) 
userAccountType = db.Column(db.Integer()) 
isUserActive = db.Column(db.Boolean()) 
isUserLockedOut = db.Column(db.Boolean()) 
userLastLogin = db.Column(db.DateTime()) 
lastInvalidLogin = db.Column(db.DateTime()) 
userCreatedAt = db.Column(db.DateTime()) 
userConfirmedAt = db.Column(db.DateTime()) 
userUpdatedAt = db.Column(db.DateTime(), onupdate=datetime.datetime.now()) 
userAddress = db.relationship('Address', backref='user', lazy='dynamic') 
userContactMethod = db.relationship('UserContactMethod', backref='user', lazy='dynamic') 
userSensor = db.relationship('Sensor', backref='user', lazy='dynamic') 
userReading = db.relationship('Reading', backref='user', lazy='dynamic') 
deliveryEvents = db.relationship('logSMTPDeliveryEvents', backref='user', lazy='dynamic') 

class Reading(db.Model): 
    __tablename__ = 'reading' 

rid = db.Column(db.Integer, primary_key=True) 
uid = db.Column(db.Integer, db.ForeignKey('user.uid')) 
sid = db.Column(db.Integer, db.ForeignKey('sensor.sid')) 
readingTimestamp = db.Column(db.DateTime()) 
readingLightValue = db.Column(db.Integer) 
readingLightStatus = db.Column(db.String(6)) 
readingTemp1 = db.Column(db.Float) 
readingTemp2 = db.Column(db.Float) 
readingHumidity = db.Column(db.Float) 

所以我的读数表有用户ID设置为读数表的外键。现在,当我尝试发出像这样的查询:

queryResult = db.session.query(Reading).filter(Reading.uid == User.uid) 

我得到所有的行,这是不正确的。我应该如何构建这个查询?

谢谢! C

回答

2

目前还不清楚你试图从你的问题中滤除什么;您是否试图找到与特定的User行对应的Reading行?

假设你有一个用户的电子邮件地址,并希望找到属于该用户的Reading的,你需要构建查询分三个步骤:

首先,开始一个查询返回行出Reading

q = session.query(Reading) 

接下来,延伸查询说,你要遵循user链接的User属性。

q = q.join(Reading.user) 

最后过滤掉只有具有所需User功能的行。确保你正在筛选具体的实际价值。

q = q.filter(User.emailAddress == '[email protected]')