sqlalchemy--表关系
通过表关系查数据能更简洁的查询到需要的内容
user, user1, article, user_article(为中间表user_article关联article和user)四个表
from datetime import datetime
from sqlalchemy import Column,Integer,String,DateTime
from connect import Base
from sqlalchemy.orm import relationship # 把数据库的表映射成python的类(继承Base类) 用python中的类(继承Base类)来表示mysql的表
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
username = Column(String(20),nullable=False)
password = Column(String(50))
creatime = Column(DateTime,default=datetime.now())
def __repr__(self): # 重写repr方法 return "<User(id=%s,username=%s,password=%s,createtime=%s)>" %(
self.id,
self.username,
self.password,
self.creatime
)
from sqlalchemy import ForeignKey
class User1(Base):
__tablename__ = 'new1'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(10),nullable=False)
password = Column(String(50))
user_id = Column(Integer,ForeignKey('user.id'))
# relationship必须有外键才能使用
user1 = relationship('User',backref='new1',uselist=False,cascade='all') # 表明一对一的表关系
def __repr__(self): # 重写repr方法 return "<User1(id=%s,name=%s,password=%s)>" %(
self.id,
self.name,
self.password
) from sqlalchemy import Table
user_article = Table( # 中间表
'user_article',Base.metadata,
Column('user_id',Integer,ForeignKey('user.id'),primary_key=True),
Column('article_id',Integer,ForeignKey('article.id'),primary_key=True) # 复合主键
) class Article(Base):
__tablename__ = 'article'
id = Column(Integer,primary_key=True,autoincrement=True)
content = Column(String(100),nullable=True)
create_time = Column(DateTime,default=datetime.now) article_user = relationship('User',backref='article',secondary=user_article) def __repr__(self):
return '<Article(id=%s, content=%s, create_time=%s)>' %(
self.id,
self.content,
self.create_time
) if __name__ == '__main__':
Base.metadata.create_all()
一对一表关系 user 和 user1


# 表关系 一对一
# 在类创建表(必须有外键) 类的后面 写上relationship 需导入 from sqlalchemy.orm import relationship
# User类 new1:给User的每条数据对象增加的新属性(外键表的数据)
# user1 = relationship('User', backref='new1', uselist=False, cascade='all') 'all' 所有操作关联到关联对象去
# uselist=False:限制表为一对一关系 cascade:删除数据的限制
row = session.query(User).all()
print(row, dir(row[0])) # row[0] tuple
print(row[0].new1) # # 反向取值.new1 从User取User1的数据 row =session.query(User1).first()
print(row.user1) # 正向取值 .user1 从User1取User的数据 >>> [<User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>, <User(id=2,username=tj,password=123qwe1,createtime=2018-03-07 16:54:09)>,
<User(id=3,username=tj1,password=123qwe2,createtime=2018-03-07 16:58:09)>, <User(id=4,username=tj2,password=123qwe3,createtime=2018-03-07 16:07:09)>,
<User(id=5,username=budong,password=qweq,createtime=2018-03-08 05:10:38)>]
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
'__lt__', '__mapper__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__table__', '__tablename__', '__weakref__', '_decl_class_registry', '_sa_class_manager', '_sa_instance_state', 'creatime', 'id', 'metadata', 'new1',
'password', 'username']
>>> [<User1(id=1,name=ha,password=1)>]
>>> <User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)>
一对多:uselist=True, 时为一对多关系,因为relationship默认为一对多关系 所以不传入uselist也为一对多关系
# user1 = relationship('User', backref='new1', uselist=True, cascade='all') 为 '多' 的需要外键关联为 ‘一’ 的,唯一的表用主键限制
多对多 user 和 user_article中间表 及article



# 多对多 relationship 需要通过建立两表关联id的中间关联表--通过Table建立(复合主键,外键)
# 不传入uselist or uselist=True 则表示一对多的表关系
# article_user = relationship('User', backref='article', secondary=user_article)
row = session.query(User).first()
print(row, dir(row))
print(row.new1)
print(row.article) # 反向取值 通过relationship添加的article属性取到对应的数据 row = session.query(Article).first()
print(row)
print(row.article_user) # 正向取值 通过article_user取article对应的user数据 >>> <User(id=1,username=budong,password=qwe123,createtime=2018-03-07 16:57:09)> ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__mapper__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__table__', '__tablename__', '__weakref__', '_decl_class_registry', '_sa_class_manager',
'_sa_instance_state', 'article', 'creatime', 'id', 'metadata', 'new1', 'password', 'username']
>>> [<User1(id=1,name=ha,password=1)>]
>>> [<Article(id=2, content=content2, create_time=2018-03-02 02:51:54)>]
>>> <Article(id=1, content=content1, create_time=2018-03-10 01:55:39)>
>>> [<User(id=3,username=tj1,password=123qwe2,createtime=2018-03-07 16:58:09)>]
sqlalchemy--表关系的更多相关文章
- ORM SQLAlchemy 表于表的关系
1表与表之间三种关系 1.1 一对一关系 举例: 一个丈夫对应一个妻子,一个妻子对应一个丈夫 1.2 一对多关系 举例:一个人可以拥有多辆汽车,要求查询某个人拥有的所有车辆 分析:这种情况其实也可以采 ...
- Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能
利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...
- SQLAlchemy(三):外键、连表关系
SQLAlchemy03 /外键.连表关系 目录 SQLAlchemy03 /外键.连表关系 1.外键 2.ORM关系以及一对多 3.一对一的关系 4.多对多的关系 5.ORM层面的删除数据 6.OR ...
- Python之路第十三天,高级(7)-详述数据库一对多,多对多表关系的设计以及如何查询
一对多表设计和查询方法 #!/usr/bin/env python3 # Author: Zhangxunan from sqlalchemy import create_engine from sq ...
- tornado框架基础08-sqlalchemy表关系和简单登录注册
01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...
- SQLAlchemy03 /外键、连表关系
SQLAlchemy03 /外键.连表关系 目录 SQLAlchemy03 /外键.连表关系 1.外键 2.ORM关系以及一对多 3.一对一的关系 4.多对多的关系 5.ORM层面的删除数据 6.OR ...
- powerdesigner 绘制表关系和导出sql
1.生成图(A图,B图) 2.创建关系(palette工具栏里有个线条,主表子表关系连接即可,拖动是由顺序的,一对多即从A表往B表连接) 3.这里小说一下 一开始是CDM模式,可以在软件最顶层看到 ...
- 在Sql Server 2005中将主子表关系的XML文档转换成主子表“Join”形式的表
本文转载:http://www.cnblogs.com/Ricky81317/archive/2010/01/06/1640434.html 最近这段时间在Sql Server 2005下做了很多根据 ...
- Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理
Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理 本博文主要介绍 Laravel 框架中 Eloquent 对一对多关系的处理以及在 Laravel Administra ...
- Hibernate框架进阶(中篇)之多表关系
导读 Hibernate进阶主要分为上中下三篇,本文是中篇,主要讲解Hibernate框架中多表关系的实现.我们知道多表关系有一对一.一对多(多对一)和多对多三种关系.而1对1关系一般合并为一个表处理 ...
随机推荐
- Sublime 下配置vim模式 + VintageEx-master下载地址
VintageEx-master下载地址: 官方地址:https://github.com/SublimeText/VintageEx 百度云链接: http://pan.baidu.com/s ...
- CodeForces - 1073E :Segment Sum (数位DP)
You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from ...
- IIS7中Ajax.AjaxMethod无效的原因及解决方法
使用Ajax.AjaxMethod方法在asp.net的服务器下一切正常,用iis的时候,js中总是cs类找不到,具体的解决方法如下,遇到类似情况的朋友可以参考下 最近做用Ajax.AjaxMetho ...
- LAMP环境安装实例
- 不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 Lazy 中导致死锁
WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型.其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程. 然而,如果你在 Lazy 上下文中使用了 ...
- NSObject之一
Objective-C中有两个NSObject,一个是NSObject类,另一个是NSObject协议.而其中NSObject类采用了NSObject协议.在本文中,我们主要整理一下NSObject类 ...
- 玩转ptrace (一)
转自http://www.cnblogs.com/catch/p/3476280.html [本文翻译自这里: http://www.linuxjournal.com/article/6100?pag ...
- pycharm PYTHONPATH
Hi brandenju! I believe os.chdir doesn't affect PYTHONPATH so changing your working directory at run ...
- MySQL--自增列持久化问题
====================================================================== 自增列持久化问题 5.5/5.6/5.7三个版本中,MyS ...
- 微软通过.NET Native为Windows Store应用提速
.NET Native是微软的一次尝试,旨在降低Windows Store应用的启动时间和内存占用. 自从去年11月份,有人发现Windows Store应用的启动速度有了大幅提高后,对该项目的猜测就 ...