2017-03-03 74 views
0

我想要熟悉sqlalchemy中的db.relatioships,這樣我就可以構建允許更復雜的查詢並擁有「未來驗證」代碼的模型。在sqlalchemy中查詢外鍵

我似乎無法得到我對這些關係的查詢正常工作。 錯誤發生在最後2個小循環中的查詢中。這整個代碼應該複製n粘貼到你的python提示符並工作。

任何提示讓這種查詢工作? (我希望這是有經驗的開發人員提供了一塊蛋糕,可惜我不是一個開發商。)

#!/usr/bin/python 
from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
from sqlalchemy import or_, and_ 
#http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite://" 
db = SQLAlchemy(app) 

class Magazine(db.Model): 
    __tablename__ = 'tbl_magazine' 
    id = db.Column(db.Integer, primary_key=True) 
    magazineTitle = db.Column(db.String(120), unique=False, nullable=False) 
    magazineLanguage = db.Column(db.String(120), unique=False, nullable=False) 
    cover_id = db.Column(db.Integer, db.ForeignKey('tbl_cover.id')) 
    cover = db.relationship('Cover', back_populates='magazines') 

class Cover(db.Model): 
    __tablename__ = 'tbl_cover' 
    id = db.Column(db.Integer, primary_key=True) 
    coverTitle = db.Column(db.String(120), unique=False, nullable=False) 
    coverAuthor = db.Column(db.String(120), unique=False, nullable=False) 
    magazines = db.relationship('Magazine', back_populates='cover') 

db.create_all() 
c0 = Cover(coverTitle = "FadingSun", coverAuthor="John") 
c1 = Cover(coverTitle = "FadingMoon", coverAuthor="John") 
c2 = Cover(coverTitle = "SportsCar", coverAuthor="Jack") 
db.session.add(c0) 
db.session.add(c1) 
db.session.add(c2) 
db.session.commit() 
m0 = Magazine(magazineTitle = "Times feb17",magazineLanguage = "French", cover_id=c0.id) 
m1 = Magazine(magazineTitle = "Times feb17",magazineLanguage = "English", cover_id=c2.id) 
m2 = Magazine(magazineTitle = "Times jan17",magazineLanguage = "English", cover_id=c0.id) 
m3 = Magazine(magazineTitle = "Vogue feb17",magazineLanguage = "English", cover_id=c1.id) 
m4 = Magazine(magazineTitle = "Spain oct16",magazineLanguage = "English", cover_id=c0.id) 
db.session.add(m0) 
db.session.add(m1) 
db.session.add(m2) 
db.session.add(m3) 
db.session.add(m4) 
db.session.commit() 

print("lets get all magazine titles with fading sun") 
for m in Magazine.query.filter(Magazine.cover.coverTitle == "FadingSun").all(): 
    print("%s has \"FadingSun\" coverTitle and was created by %s"%(m.magazineTitle,m.cover.coverAuthor)) 

print("lets get all magazine titles with fading sun in French") 
for m in Magazine.query.filter(and_ (Magazine.cover.coverTitle == "FadingSun"), (Magazine.magazineLanguage == "French")).all(): 
    print("%s has \"FadingSun\" coverTitle and was created by %s"%(m.magazineTitle,m.cover.coverAuthor)) 

print("lets get all cover titles that are on a magazine in English") 
covers = {} 
for m in Magazine.query.filter(Magazine.magazineLanguage == "English").all(): 
    if m.cover.coverTitle in covers: 
    covers[m.cover.coverTitle] += 1 
    else: 
    covers[m.cover.coverTitle] = 1 

for k,v in covers.iteritems(): 
    print("%s occurs %s times on an english magazine"%(k,v)) 

附:我注意到最後一個DID的工作,是這樣做的正確方法?

主要誤差是在第一查詢2)

>>> print("lets get all magazine titles with fading sun") 
lets get all magazine titles with fading sun 
>>> for m in Magazine.query.filter(Magazine.cover.coverTitle == "FadingSun").all(): 
... print("%s has \"FadingSun\" coverTitle and was created by %s"%(m.magazineTitle,m.cover.coverAuthor)) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/attributes.py", line 193, in __getattr__ 
    key) 
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Magazine.cover has an attribute 'coverTitle' 
>>> 
>>> 
>>> print("lets get all magazine titles with fading sun in French") 
lets get all magazine titles with fading sun in French 
>>> for m in Magazine.query.filter(and_ (Magazine.cover.coverTitle == "FadingSun"), (Magazine.magazineLanguage == "French")).all(): 
... print("%s has \"FadingSun\" coverTitle and was created by %s"%(m.magazineTitle,m.cover.coverAuthor)) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/attributes.py", line 193, in __getattr__ 
    key) 
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Magazine.cover has an attribute 'coverTitle' 
+0

你有什麼問題?你有錯誤嗎?然後顯示它 –

回答

0

第一2個查詢可以固定有。加入(

print("lets get all magazine titles with fading sun") 
for m in db.session.query(Magazine).join(Magazine.cover).filter(Cover.coverTitle == "FadingSun").all(): 
    print("%s has \"FadingSun\" coverTitle and was created by %s"%(m.magazineTitle,m.cover.coverAuthor)) 

print("lets get all magazine titles with fading sun in French") 
for m in db.session.query(Magazine).join(Magazine.cover).filter(and_ (Cover.coverTitle == "FadingSun"), (Magazine.magazineLanguage == "French")).all(): 
    print("%s has \"FadingSun\" coverTitle and was created by %s"%(m.magazineTitle,m.cover.coverAuthor)) 

這些(如在下面的第一評論請求)工作!