sqlalchemy foreign key查询和backref

首先在mysql中创建两个表如下:

mysql> create table user( id int,name varchar(8) , primary key(id));
Query OK, 0 rows affected (0.01 sec)

mysql> create table addr(id int,val varchar(100),user_id int, primary key(id),foreign key(user_id)  references user(id) );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into user values(8,‘kramer‘);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user values (18,‘Tom‘);
Query OK, 1 row affected (0.00 sec)

mysql> insert into addr values(1,‘peking‘,8);
Query OK, 1 row affected (0.00 sec)

然后我们用 sqlacodegen 来生成对应的 class。

[email protected]:/opt# sqlacodegen --schema rdb  mysql://root:[email protected]:3306
# coding: utf-8
from sqlalchemy import Column, ForeignKey, Integer, String, Table, text
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
metadata = Base.metadata

class Addr(Base):
    __tablename__ = ‘addr‘
    __table_args__ = {u‘schema‘: ‘rdb‘}

    id = Column(Integer, primary_key=True, server_default=text("‘0‘"))
    val = Column(String(100))
    user_id = Column(ForeignKey(u‘rdb.user.id‘), index=True)

    user = relationship(u‘User‘)

t_mgr = Table(
    ‘mgr‘, metadata,
    Column(‘id‘, Integer, nullable=False),
    Column(‘name‘, String(18)),
    schema=‘rdb‘
)

class User(Base):
    __tablename__ = ‘user‘
    __table_args__ = {u‘schema‘: ‘rdb‘}

    id = Column(Integer, primary_key=True, server_default=text("‘0‘"))
    name = Column(String(8))

要注意的是原来该数据库中还有个表mgr,但是没有生成class而是生成一个table。这是因为它没有primary key。

接下来我们把生成的代码保存成models.py文件然后操作。

from models import *from sqlalchemy import *db=create_engine(‘mysql://root:[email protected]:3306/rdb?charset=utf8‘,encoding = "utf-8",echo =True)

from sqlalchemy.orm import sessionmaker

S=sessionmaker(bind=db)

s=S()

u=s.query(User).first()
u.addr

AttributeError: ‘User‘ object has no attribute ‘addr‘

u.Addr

AttributeError: ‘User‘ object has no attribute ‘Addr‘a=s.query(Addr).first()
a.user
Out[11]: <models.User at 0xa12e88c>

可以看见通过user来获取addr获取不到,但是通过addr获取user可以。这是因为 addr 下面的代码

user = relationship(u‘User‘)

这段代码说明addr可以通过这个函数来找到对应的user

我们改一下models.py 。把这行代码改成user = relationship(u‘User‘,backref=backref(‘addr‘))就可以通过user来找addr了。新的代码说明,user可以通过backref找到addr

要注意得import sqlalchemy.orm.backref

[email protected]:/opt/temp# cat b.py
# coding: utf-8
from sqlalchemy import Column, ForeignKey, Integer, String, Table, text
from sqlalchemy.orm import relationship,backref
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
metadata = Base.metadata

class Addr(Base):
    __tablename__ = ‘addr‘
    __table_args__ = {u‘schema‘: ‘rdb‘}

    id = Column(Integer, primary_key=True, server_default=text("‘0‘"))
    val = Column(String(100))
    user_id = Column(ForeignKey(u‘rdb.user.id‘), index=True)

    #user = relationship(u‘User‘)
    user = relationship(u‘User‘,backref=backref(‘addr‘))

t_mgr = Table(
    ‘mgr‘, metadata,
    Column(‘id‘, Integer, nullable=False),
    Column(‘name‘, String(18)),
    schema=‘rdb‘
)

class User(Base):
    __tablename__ = ‘user‘
    __table_args__ = {u‘schema‘: ‘rdb‘}

    id = Column(Integer, primary_key=True, server_default=text("‘0‘"))
    name = Column(String(8))

红色部分是改过的代码,注意有两处

下面用python调用

In [1]: from b import *

In [2]: from sqlalchemy import *

In [3]: db=create_engine(‘mysql://root:[email protected]:3306/rdb?charset=utf8‘,encoding = "utf-8",echo =True)

In [4]: from sqlalchemy.orm import sessionmaker

In [5]: S=sessionmaker(bind=db)

In [6]: s=S()

In [7]: u=s.query(User).first()

In [8]: u.addr

 Out[8]: [<b.Addr at 0xab31c6c>]

In [10]: a.user
Out[10]: <b.User at 0xab3186c>
时间: 2024-08-26 22:08:06

sqlalchemy foreign key查询和backref的相关文章

postgresql----数据库表约束----FOREIGN KEY

六.FOREIGN KEY ---- 外键约束 外键可以是单个字段,也可以是多个字段.所谓的外键约束就是引用字段必须在被引用字段中存在,除非引用字段部分为NULL或全部为NULL(由MATCH TYPE决定),否则INSERT或UPDATE时将返回失败,且被引用字段必须有唯一约束或是主键. 外键约束语法相对较复杂一点,创建外键的语法如下: ALTER TABLE tbl_foreign CONSTRAINT fk_constraint FOREIGN KEY(col1,col2) REFEREN

sql数据库删除表的外键约束(INSERT 语句与 FOREIGN KEY 约束&quot;XXX&quot;冲突。该冲突发生于数据库&quot;XXX&quot;,表&quot;XXX&quot;, column &#39;XXX)

使用如下SQL语句查询出表中外键约束名称: 1 select name 2 from sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o.object_id 3 where f.parent_object_id=object_id('表名') 执行如下SQL语句删除即可. 1 alter table 表名 drop constraint 外键约束名 sql数据库删除表的外键约束(INSERT 语句与 F

【转】 #1451 - Cannot delete or update a parent row: a foreign key constraint fails 问题的解决办法

转载地址:http://blog.csdn.net/donglynn/article/details/17056099 错误 SQL 查询: DELETE FROM `zmax_lang` WHERE CONVERT( `zmax_lang`.`lang` USING utf8 ) = 'fr' LIMIT 1 MySQL 返回: #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`myre

数据库中的參照完整性(Foreign Key)

之前在项目中遇到了这样一个问题,我举得简单的样例来说明. 比方我们有两个表,一个表(department)存放的是部门的信息,比如部门id,部门名称等:还有一个表是员工表(staff),员工表里面肯定要存放每一个员工所在的部门. 那问题来了,假设我们这个时候删除了部门表中的某条记录,在staff表中会发生什么? 为了解答上面的问题,让我们先来回想一下什么是參照完整性. 我们经常希望保证在一个关系中给定属性集上的取值也在还有一个关系的特定属性集的取值中出现.这样的情况称为參照完整性(referen

数据库中的参照完整性(Foreign Key)

之前在项目中遇到了这样一个问题,我举得简单的例子来说明, 比如我们有两个表,一个表(department)存放的是部门的信息,例如部门id,部门名称等:另一个表是员工表(staff),员工表里面肯定要存放每个员工所在的部门.那问题来了,如果我们这个时候删除了部门表中的某条记录,在staff表中会发生什么? 为了解答上面的问题,让我们先来回顾一下什么是参照完整性. 我们常常希望保证在一个关系中给定属性集上的取值也在另一个关系的特定属性集的取值中出现.这种情况称为参照完整性(referential

MySQL 之 foreign key

前段回顾 create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); #解释: 类型:使用限制字段必须以什么样的数据类型传值 约束条件:约束条件是在类型之外添加一种额外的限制 # 注意: 1. 在同一张表中,字段名是不能相同 2. 宽度和约束条件可选,字段名和类型是必须的 3.最后一个字段后不加逗号 把所有数据都存放于一张表的弊端 1.表的组织结构复杂不清晰 2.浪费空间 3.扩展性极差 补充知识:

Django ORM批量操作和foreign key

批量操作 Django ORM 中的批量操作 Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作.但在Django的ORM中的批量操作却要完美得多,真是一个惊喜. 数据模型定义 首先,定义一个实例使用的django数据库模型Product,只是象征性地定义了两个字段name和price. from django.db import models class Product(models.Model): name = models.Cha

四十二:数据库之SQLAlchemy之数据查询懒加载技术

懒加载在一对多,或者多对多的时候,如果要获取多的这一部分的数据的时候,通过一个relationship定义好对应关系就可以全部获取,此时获取到的数据是list,但是有时候不想获取全部数据,如果要进行数据筛选就需要遍历筛选,就比较麻烦,可以从查询返回值里面入手,比如在获取到的数据里面还要加个过滤条件,则需要在relationship中加一个参数:lazy='dynamic',以后通过relationship定义的对应关系获取到的就不是一个列表,而是一个AppenderQuery对象,这种对象既可以

SQL FOREIGN KEY 约束

SQL FOREIGN KEY 约束 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY. 让我们通过一个例子来解释外键.请看下面两个表: "Persons" 表: Id_P LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing &qu