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。
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的更多相关文章
- 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 ...
- 无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用。
在删除northwindcs表时,发生报错,消息 3726,级别 16,状态 1,第 2 行,无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用.此时判断是因为有其他表的外键 ...
- 【转】 #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 ...
- mysql 外键(FOREIGN KEY)
最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...
- MSSQL导入数据时,出现“无法截断表 因为表正由Foreign key引用”错误
* 错误 0xc002f210: 准备 SQL 任务: 执行查询“TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass] ”失败,错误如下:“无 ...
- MySQL(10):实体、实体表和外键(foreign key)
1.实体 数据库管理系统中的各种用于数据管理方便而设定的各种数据管理对象,如:数据库表.视图.存储过程等都是数据库实体.广义上讲,这些对象中所存储的数据也是数据库实体.因为它们也是确切存 ...
- InnoDB和Foreign KEY Constraints
InnoDB表中中Foreign Key定义 1. InnoDB允许a foreign key引用一个索引列或者索引组列. 2. InnoDB现在并不支持用户定义的分区表有foreign keys,这 ...
- 数据库中的參照完整性(Foreign Key)
之前在项目中遇到了这样一个问题,我举得简单的样例来说明. 比方我们有两个表,一个表(department)存放的是部门的信息,比如部门id,部门名称等:还有一个表是员工表(staff),员工表里面肯定 ...
- SQLServer之修改FOREIGN KEY约束
使用SSMS数据库管理工具修改FOREIGN KEY约束 1.连接数据库,选择数据表->右键点击->选择设计(或者展开键,选择要修改的外键,右键点击,选择修改,后面修改步骤相同). 2.在 ...
随机推荐
- 如何取消android studio启动时自动打开上次关闭的项目
Androidstudio默认每次android studio启动就会自动打开上次关闭的项目,如果想要取消并让它显示此界面 只需要
- UVM基础之---------uvm factory机制register
factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在 ...
- docloud后台管理项目(开篇)
最近朋友做app需要web做后台管理,所以花了一周时间做了这个项目. 废话不多说,开发环境是nginx+php5.3,使用thinkphp框架.是一个医疗器械数据统计的后台,业务功能很简单就是查看用户 ...
- Mac上简单常用Terminal命令
方案1 SSH是一个非常伟大的工具,如果你要在互联网上远程连接到服务器,那么SSH无疑是最佳的候选.SSH是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃听,连接劫持和其它攻击.本文将为 ...
- POJ_1163_The triangle
The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40079 Accepted: 24144 De ...
- CAD绘制多行文字
在CAD设计时,需要绘制多行文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawMText 绘制一个多行文字.详细说明如下: 参数 说明 DOUBLE dP ...
- Eclipse报错:Setting property 'source' to 'org.eclipse.jst.jee.server:xx' did not find a matching property
Shell代码 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to ' ...
- XGBoost参数中文翻译以及参数调优
XGBoost:参数解释:https://blog.csdn.net/zc02051126/article/details/46711047 机器学习系列(11)_Python中Gradient Bo ...
- Linux未来监控tracing框架——eBPF
Linux未来监控tracing框架--eBPF eBPF源于早年间的成型于 BSD 之上的传统技术 BPF(Berkeley Packet Filter).BPF 的全称是 Berkeley Pac ...
- TWaver3D特效之高光反射
前篇我们介绍了TWaver 3D的环境映射特效,下面我们接着给大家分享高光反射特效.高光反射定义了物体上的某一区域比其他地方更反光.在高光反射的贴图中,黑色区域的反射率为0(完全不反光),白色区域的反 ...