首先在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。

root@rijx:/opt# sqlacodegen --schema rdb  mysql://root:passw0rd@localhost: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:passw0rd@localhost: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

root@rijx:/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:passw0rd@localhost: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>

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

  1. sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1091, "Can't DROP 'users_ibfk_1'; check that column/key exists") [SQL: ALTER TABLE users DROP FOREIGN KEY users_ibfk_1]

    flask 迁移数据库报错 报错: sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1091, "Can't DROP ...

  2. 无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用。

    在删除northwindcs表时,发生报错,消息 3726,级别 16,状态 1,第 2 行,无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用.此时判断是因为有其他表的外键 ...

  3. 【转】 #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 ...

  4. mysql 外键(FOREIGN KEY)

    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...

  5. MSSQL导入数据时,出现“无法截断表 因为表正由Foreign key引用”错误

    * 错误 0xc002f210: 准备 SQL 任务: 执行查询“TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass] ”失败,错误如下:“无 ...

  6. MySQL(10):实体、实体表和外键(foreign key)

    1.实体        数据库管理系统中的各种用于数据管理方便而设定的各种数据管理对象,如:数据库表.视图.存储过程等都是数据库实体.广义上讲,这些对象中所存储的数据也是数据库实体.因为它们也是确切存 ...

  7. InnoDB和Foreign KEY Constraints

    InnoDB表中中Foreign Key定义 1. InnoDB允许a foreign key引用一个索引列或者索引组列. 2. InnoDB现在并不支持用户定义的分区表有foreign keys,这 ...

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

    之前在项目中遇到了这样一个问题,我举得简单的样例来说明. 比方我们有两个表,一个表(department)存放的是部门的信息,比如部门id,部门名称等:还有一个表是员工表(staff),员工表里面肯定 ...

  9. SQLServer之修改FOREIGN KEY约束

    使用SSMS数据库管理工具修改FOREIGN KEY约束 1.连接数据库,选择数据表->右键点击->选择设计(或者展开键,选择要修改的外键,右键点击,选择修改,后面修改步骤相同). 2.在 ...

随机推荐

  1. 397 Integer Replacement 整数替换

    给定一个正整数 n,你可以做如下操作:1. 如果 n 是偶数,则用 n / 2替换 n.2. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n.n 变为 1 所需的最小替换次数是多少?示例 ...

  2. c/c++导出lua绑定

    [转载]https://note.youdao.com/share/?id=0f4132271151c4b62f9afb712e8304d9&type=note#/ 1.在纯C环境下,把C函数 ...

  3. [转]微信开发.Net 接入示例

    本文转自:http://my.oschina.net/lcak/blog/219618 微信公众平台接口开发官方仅提供了 PHP 接入示例代码, 网上找到的.Net代码多半需要积分下载, 所以自己写了 ...

  4. HTML+CSS 基础布局(案列一)

    刚html刚讲完马上就接着css,周末的任务就是高仿案例,结果有点遭 图文布局 代码 css(内部样式) html <!DOCTYPE html><html><head& ...

  5. Android RxJava2 浅析

    原文地址:http://blog.csdn.net/maplejaw_/article/details/52442065 Observable 在RxJava1.x中,最熟悉的莫过于Observabl ...

  6. Linux学习日记之Deepin下查看crontab运行日志

    Deepin使用 journalctl 替代了 syslog 来处理系统日志 故查看crontab运行日志应使用 journalctl -f /usr/sbin/cron

  7. Android基础TOP5_4:点击按钮更换样式,设置透明度

    在res/drawable创建两个样式 点击前/点击后 round: <?xml version="1.0" encoding="utf-8"?> ...

  8. mybatis 关联查询

    1.关联的两个实体类 外部类 parent public class Parent{ private String parentId; private String parentName; priva ...

  9. 【译】x86程序员手册27-7.6任务链

    7.6 Task Linking 任务链 The back-link field of the TSS and the NT (nested task) bit of the flag word to ...

  10. 并发编程学习笔记(5)----AbstractQueuedSynchronizer(AQS)原理及使用

    (一)什么是AQS? 阅读java文档可以知道,AbstractQueuedSynchronizer是实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量.事件,等等)提供一个框架, ...