通过表关系查数据能更简洁的查询到需要的内容

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--表关系的更多相关文章

  1. ORM SQLAlchemy 表于表的关系

    1表与表之间三种关系 1.1 一对一关系 举例: 一个丈夫对应一个妻子,一个妻子对应一个丈夫 1.2 一对多关系 举例:一个人可以拥有多辆汽车,要求查询某个人拥有的所有车辆 分析:这种情况其实也可以采 ...

  2. Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能

    利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...

  3. SQLAlchemy(三):外键、连表关系

    SQLAlchemy03 /外键.连表关系 目录 SQLAlchemy03 /外键.连表关系 1.外键 2.ORM关系以及一对多 3.一对一的关系 4.多对多的关系 5.ORM层面的删除数据 6.OR ...

  4. Python之路第十三天,高级(7)-详述数据库一对多,多对多表关系的设计以及如何查询

    一对多表设计和查询方法 #!/usr/bin/env python3 # Author: Zhangxunan from sqlalchemy import create_engine from sq ...

  5. tornado框架基础08-sqlalchemy表关系和简单登录注册

    01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...

  6. SQLAlchemy03 /外键、连表关系

    SQLAlchemy03 /外键.连表关系 目录 SQLAlchemy03 /外键.连表关系 1.外键 2.ORM关系以及一对多 3.一对一的关系 4.多对多的关系 5.ORM层面的删除数据 6.OR ...

  7. powerdesigner 绘制表关系和导出sql

    1.生成图(A图,B图) 2.创建关系(palette工具栏里有个线条,主表子表关系连接即可,拖动是由顺序的,一对多即从A表往B表连接) 3.这里小说一下   一开始是CDM模式,可以在软件最顶层看到 ...

  8. 在Sql Server 2005中将主子表关系的XML文档转换成主子表“Join”形式的表

    本文转载:http://www.cnblogs.com/Ricky81317/archive/2010/01/06/1640434.html 最近这段时间在Sql Server 2005下做了很多根据 ...

  9. Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理

    Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理 本博文主要介绍 Laravel 框架中 Eloquent  对一对多关系的处理以及在 Laravel Administra ...

  10. Hibernate框架进阶(中篇)之多表关系

    导读 Hibernate进阶主要分为上中下三篇,本文是中篇,主要讲解Hibernate框架中多表关系的实现.我们知道多表关系有一对一.一对多(多对一)和多对多三种关系.而1对1关系一般合并为一个表处理 ...

随机推荐

  1. chapter02 PCA主成分分析在手写数字识别分类的应用

    #coding=utf8 # 导入numpy工具包. import numpy as np # 导入pandas用于数据分析. import pandas as pd from sklearn.met ...

  2. 设置ip地址、掩码、网关、DNS

    @echo offcolor f8mode con cols=40 lines=8echo.echo.echo      设置IP为:echo.set /p ip=              192. ...

  3. 20155336 2016-2017-2《JAVA程序设计》第九周学习总结

    20155336 2016-2017-2<JAVA程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC(Java DataBase Connectivity)即java数据库连接 ...

  4. (2)socket的基础使用(基于TCP协议)

    socket()模块函数用法 基于TCP协议的套接字程序 netstart -an | findstr 8080 #查看所有TCP和UDP协议的状态,用findstr进行过滤监听8080端口 服务端套 ...

  5. 字符串的比较【string和字符数组】

    无论是string 还是 字符数组的字符串比较函数,返回的都是字典序的大小.如 1234 和 5 比较时就是1234的字典序小于5,要想比较字符串表示的数字的大小,需要自己写函数比较

  6. makefile,让编译更简单

    陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的 ...

  7. 剑指offer-第一个只出现一次的字符-字符串和数组

    用到的算法都是像冒泡排序,直接选择排序,插入排序 每趟进行处理,这个趟是没有什么实际意义的 变量j一次从头走到尾进行一次循环枚举遍历扫描 一.题目:第一个只出现一次的字符 题目:在字符串中找出第一个只 ...

  8. yugabyte 集成JanusGraph测试

    yugabyte 集成图数据库JanusGraph,原理比较简单就是yugabyte 内置Cassandra,配置好JanusGraph 的访问就可以了. 使用docker 模式部署 创建yugaby ...

  9. 转 MetaWeblog API 编写

    如今,许多人都熟悉个人和公司或业界主办的博客.后者明显成为了传统公司和行业网站的下一代新兴产物.博客的内容涉及从简洁的特制产品公告和公共关系到实用且深刻的主题探索,这些主题可能对公司的产品或行业的未来 ...

  10. FTP文件服务器代码

    文件操作的核心代码: /// <summary> /// FTP文件信息类(帮助进行文件的上传于下载) /// </summary> [Serializable()] publ ...