Python sqlalchemy中对外键的查询

Python sqlalchemy中对外键的查询,python,sqlalchemy,Python,Sqlalchemy,我正试图熟悉sqlalchemy中的db.relatioships,以便能够构建允许更复杂查询的模型,并拥有“经得起未来考验”的代码 我似乎无法让我对这些关系的质疑正常运行。 错误出现在最后两个小循环的te查询中。这整段代码应该复制并粘贴到python提示符中,然后工作 关于让这种查询工作起来有什么提示吗?(我希望这对有经验的开发人员来说是小菜一碟,不幸的是,我不是一名开发人员。) p、 我注意到最后一个确实有效,这是正确的方法吗 主要错误出现在前两个查询中(如下面第一条注释所要求的) >>打印

我正试图熟悉sqlalchemy中的db.relatioships,以便能够构建允许更复杂查询的模型,并拥有“经得起未来考验”的代码

我似乎无法让我对这些关系的质疑正常运行。 错误出现在最后两个小循环的te查询中。这整段代码应该复制并粘贴到python提示符中,然后工作

关于让这种查询工作起来有什么提示吗?(我希望这对有经验的开发人员来说是小菜一碟,不幸的是,我不是一名开发人员。)

p、 我注意到最后一个确实有效,这是正确的方法吗

主要错误出现在前两个查询中(如下面第一条注释所要求的)

>>打印(“让我们在夕阳下获得所有杂志标题”)
让我们在夕阳下获得所有杂志的标题
>>>对于Magazine.query.filter(Magazine.cover.coverTitle==“FadinSun”).all()中的m:
...   打印(“%s”具有“FadingSun”隐藏标题,由%s“%创建(m.magazineTitle,m.cover.Coverage Author))
... 
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/orm/attributes.py”,第193行,在__
钥匙)
AttributeError:与Magazine.cover关联的“InstrumentedAttribute”对象和“Comparator”对象都没有属性“coverTitle”
>>> 
>>> 
>>>印刷(“让我们用法语获取所有夕阳渐弱的杂志标题”)
让我们用法语获得所有《夕阳》杂志的标题
>>>对于Magazine.query.filter中的m(和_uz(Magazine.cover.coverTitle==“FadingSun”),(Magazine.magazineLanguage==“French”)。全部()
...   打印(“%s”具有“FadingSun”隐藏标题,由%s“%创建(m.magazineTitle,m.cover.Coverage Author))
... 
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/orm/attributes.py”,第193行,在__
钥匙)
AttributeError:与Magazine.cover关联的“InstrumentedAttribute”对象和“Comparator”对象都没有属性“coverTitle”

前两个查询可以用.join()修复


这些工作

你有什么问题?你有错误吗?然后展示它
#!/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))
>>> 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'
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 ))