2013-09-29 43 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]')