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关系一般合并为一个表处理 ...
随机推荐
- 判断颜色信息-RGB2HSV(opencv)
前言 项目车号识别过程中,车体有三种颜色黑车黑底白字.红车红底白字.绿车黄底绿字,可以通过判断车体的颜色信息,从而判断二值化是否需要反转,主要是基于rgb2hsv函数进行不同颜色的阈值判断. matl ...
- js循环总结
js原生的循环有两种,一般的for循环和for...in循环.还有一种常用jQuery.each()循环. 一. js原生循环 a. for循环,代码如下: var myArray = [1,2,3] ...
- (考研)散列表和hashcode和hashmap
package tt; import java.util.HashMap; import java.util.Map; public class a0 { public static void mai ...
- java类库 java API jar包 C语言函数库
翁凯说:java的强大是因为类库的强大 C/C++强大是因为函数库 在程序中用到系统提供的标准函数库中的输入输出函数时 应在程序的开头写上一行:#include"stdio.h"或 ...
- restheart 基本使用
restheart 是一个方便基于mongodb的restapi 开发框架 参考项目 https://github.com/rongfengliang/restheart-docker-compose ...
- PHP安装sqlsrv和memcache扩展步骤
做了两天的实验才终于摸清楚如何将PHP连接上sqlserver数据库,以及怎样通过修改virtualhost文件来重定向,因为走得弯路比较多所以很想分享一下这次的心路历程. 第一步:安装wamp等类似 ...
- kettle--window开发环境和linux运行环境的迁移
首先要做的是将kettle在linux下搭建好. 一.搭建linux的kettle环境 1.1解压 (my_python_env)[root@hadoop26 ~]# .zip -d /usr/loc ...
- ShareMemory
项目地址 : https://github.com/kelin-xycs/ShareMemory ShareMemory 一个用 C# 实现的 No Sql 数据库 , 也可以说是 分布式 缓存 , ...
- java中Thread类分析
创建线程的方式有三种,一是创建Thread实例,二是实现Runnable接口,三是实现Callable接口,Runnable接口和Callable接口的区别是一个无返回值,一个有返回值:不管是Runn ...
- ElementUI 知识点
类型是number的el-input 去掉滚轮事件: @mousewheel.native.prevent <el-input type="number" @mousewhe ...