Python 如何使用Alchemy查询多个项目

Python 如何使用Alchemy查询多个项目,python,sqlalchemy,Python,Sqlalchemy,导入模块后: from flask import Flask from flask_sqlalchemy import SQLAlchemy 并声明app和db对象: app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' db = SQLAlchemy(app) 我继续创建两个表:User和Email: class User(db.Model): id = db.Colum

导入模块后:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
并声明
app
db
对象:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' 
db = SQLAlchemy(app)
我继续创建两个表:
User
Email

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Email', backref='person', lazy='dynamic')

class Email(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('user.id'))
有了
db.relationship
,我现在可以将多封电子邮件链接到同一
用户
。首先,我创建两个电子邮件地址:

first_email = Email(email='first@email.com')
second_email = Email(email='second@email.com')
然后,在创建时,我将这两封电子邮件传递给
User
类:

user = User(name='User Name', addresses = [first_email, second_email])
要查看哪个用户链接到哪个电子邮件,我只需使用:

print first_email.person
print user.addresses.all()
现在我想向同一
用户添加第三封电子邮件。如何将新电子邮件附加到已链接到
用户的电子邮件列表中

new_email = Email(email='new_email@example.com')
user.addresses.append(new_email)
db.session.commit()
这会将电子邮件地址附加到关系中

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

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

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Email', backref='person', lazy='dynamic')

    def add_email(self, new_email):
        linked_emails = [email.email for email in self.addresses.all()] 
        if not new_email in linked_emails:
            linked_emails.append(new_email)

        self.addresses = [Email.find_or_create(email) for email in linked_emails]



class Email(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    @staticmethod
    def find_or_create(email):
        try:
            return Email.query.filter_by(email=email).one()
        except:
            new_email = Email(email=email)
            db.session.add(new_email)
            db.session.commit()
            return new_email


first_email = Email(email='first@email.com')
second_email = Email(email='second@email.com')

user = User(name='User Name', addresses = [first_email, second_email])

db.drop_all()
db.create_all()


db.session.add(first_email)
db.session.add(second_email)
db.session.add(user)
db.session.commit()

# some extra queries
user.add_email('third@email.com')
print user.addresses.all()

print Email.find_or_create('fourth@email.com')
print Email.query.filter_by(email='fourth@email.com').one().email
print first_email.query.filter_by(email='second@email.com').one()