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()