Sqlalchemy 关系炼金术

Sqlalchemy 关系炼金术,sqlalchemy,Sqlalchemy,我是SQLALchemy的新手,试图理解这种关系,根据SQLALchemy教程,我创建了两个表,用户和地址,并创建了一些记录 问题: 1.如何访问与特定地址相关的所有用户 例如:address1=地址(email\u Address=)jack@google.com“),我需要address1对象ie的用户;但不幸的是,它显示为“无” 导入sqlalchemy 从sqlalchemy导入创建引擎 从sqlalchemy.ext.declarative导入声明性基础 从sqlalchemy导入列,

我是SQLALchemy的新手,试图理解这种关系,根据SQLALchemy教程,我创建了两个表,用户和地址,并创建了一些记录

问题: 1.如何访问与特定地址相关的所有用户

例如:
address1=地址(email\u Address=)jack@google.com“)
,我需要address1对象ie的用户;但不幸的是,它显示为“无”

导入sqlalchemy
从sqlalchemy导入创建引擎
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy导入列,整数,字符串
从sqlalchemy导入序列
从sqlalchemy.orm导入sessionmaker
从sqlalchemy导入外键
从sqlalchemy.orm导入关系,backref
Base=声明性_Base()
类用户(基本):
__tablename_uu='users'
id=列(整数,序列('user\u id\u seq'),主键=True)
名称=列(字符串(50))
全名=列(字符串(50))
密码=列(字符串(12))
定义报告(自我):
返回“”%(
self.name、self.fullname、self.password)
班级地址(基本地址):
__tablename_uu='地址'
id=列(整数,主键=True)
电子邮件地址=列(字符串(50),可空=假)
user\u id=列(整数,ForeignKey('users.id'))
用户=关系(“用户”,backref=backref('addresses',order\u by=id))
定义报告(自我):
返回“%self.email\u地址”
引擎=创建引擎('mysql+mysqldb://scott:tiger@localhost/sakila')
打印sqlalchemy.\uu版本__
Base.metadata.create_all(引擎)
打印用户表格__
会话=会话生成器(绑定=引擎)
会话=会话()
session.query(地址).delete()
session.query(用户).delete()
ed_user=user(name='ed',fullname='ed Jones',password='edpassword')
会话.添加(ed_用户)
我们的用户=session.query(user).filter\u by(name='ed').first()
打印我们的用户
打印我们的用户是ed\u用户
session.add_all([
用户(姓名='wendy',全名='wendy Williams',密码='foobar'),
用户(name='mary',fullname='mary',密码='xxg527'),
用户(name='fred',fullname='fred Flinstone',password='blah'))
session.commit()
打印ed_用户id
例如,在session.query(用户).order\u by(用户id)中:
打印instance.name,instance.fullname
打印“****开始打印****”
对于名称,session.query中的fullname(User.name,User.fullname):
打印名称,全名
打印“****开始打印****”
对于session.query(user.filter)(user.name=='ed')中的用户:
打印用户名
jack=User(name='jack',fullname='jackbean',password='ggg')
打印杰克的地址
jack.Address=[地址(电子邮件地址=)jack@google.com”),地址(电子邮件地址=)prem1pre@gmail.com')]
打印杰克。地址[1]。用户
会话.添加(杰克)
session.commit()
address1=地址(电子邮件\u Address='jack@google.com')
打印地址1.1用户
#打印地址。电子邮件地址

当您最后使用
address1
时,它是一个新实例,而不是从数据库中提取的实例。而是在数据库中查询地址

addr = session.query(Address).filter_by(email='jack@google.com').one()
print addr.email, addr.user.name

以下两个查询中的任何一个都可以完成此工作:

我可以安全地使用version-2,但我也会为表
地址(用户id、电子邮件地址)添加一个唯一的约束

addr = session.query(Address).filter_by(email='jack@google.com').one()
print addr.email, addr.user.name
# version-1: get all users which have at least one Address with given email_address
users = session.query(User).filter(User.addresses.any(Address.email_address == 'jack@google.com'))

# version-2: same result in the end, but
#  1) does not use sub-query; 
#  2) might return duplicate rows (on the database) 
#  in case a combination of (user_id, email_address) is 
#  not unique, but SA will handle this on ORM level and 
#  will not return duplicates
users = session.query(User).join(Address, User.addresses).filter(Address.email_address == 'jack@google.com')

for u in users:
    print u