one To many

 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@author: zengchunyun
"""
from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship, backref
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine Base = declarative_base()
engine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/day11',echo=True) class Child(Base):
__tablename__ = 'child' # 表名
id = Column(Integer, primary_key=True) # 表字段
parent_id = Column(Integer, ForeignKey('parent.id')) # 外键最好不要直接用类名.字段形式,避免类还没有实例化,最好以表名.字段形式
# 外键关联到另一张表的id字段,通过查找parent_id字段可以找到父亲是谁
parent = relationship('Parent') # 通过查到儿子后,通过儿子.parent.name 可以找到父亲是谁,实例相当于儿子.parent等于Parent类.类直接访问自己的name属性 class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
name = Column(String(64))
# children = relationship(Child) # 当设置外键时,第一张表如果是先创建,可以使用类名形式关系映射,否则会造成未声明先引用,最好以表名.字段进行关系映射
# 这个是单向映射关联,即一个父亲对应多个儿子,或者多个儿子对应一个父亲 Base.metadata.create_all(engine) DBSession = sessionmaker()
DBSession.configure(bind=engine)
session = DBSession() # 打开数据连接 ret = session.query(Child).filter(Child.id==1).one()
print(ret.parent.name)
ret = session.query(Parent).filter(Parent.id == 1).one()
print(ret.name)

one to many

 class Parent(Base):
__tablename__ = 'parent' # 表名
id = Column(Integer, primary_key=True)
name = Column(String(64))
children = relationship('Child', back_populates='parent') # 第一个参数为类名,当被关联的表先创建时,可以直接写类名,否则只能写字符串形式名字
# 第二个参数为双向one-to-many关系,即反向的many-to-one def __repr__(self):
return "id: {}, name: {}".format(self.id, self.name) class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
name = Column(String(43))
parent_id = Column(Integer, ForeignKey('parent.id'))
parent = relationship('Parent', back_populates='children') def __repr__(self):
return "id: {}, parent_id: {}, ".format(self.id, self.parent_id) ret = session.query(Parent).filter(Parent.id ==1).all()
print(ret)
print(ret[0].children) # 通过父亲找儿子 ret = session.query(Child).filter(Child.parent_id == Parent.id).all()
print(ret)
print(ret[0].parent.name) # 通过儿子找父亲

one to many,这个效果与上面这个实例一样,这样可以少写一个

 # children = relationship('Child', back_populates='parent') 映射关系
 class Parent(Base):
__tablename__ = 'parent' # 表名
id = Column(Integer, primary_key=True)
name = Column(String(64))
# children = relationship('Child', back_populates='parent') # 第一个参数为类名,当被关联的表先创建时,可以直接写类名,否则只能写字符串形式名字
# 第二个参数为双向one-to-many关系,即反向的many-to-one def __repr__(self):
return "id: {}, name: {}".format(self.id, self.name) class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
name = Column(String(43))
parent_id = Column(Integer, ForeignKey('parent.id'))
parent = relationship('Parent', backref='children') def __repr__(self):
return "id: {}, parent_id: {}, ".format(self.id, self.parent_id)

one to many, 通过父亲查多个儿子

 class Child(Base):
__tablename__ = 'child' # 表名
id = Column(Integer, primary_key=True) # 表字段
name = Column(String(43))
parent_id = Column(Integer, ForeignKey('parent.id')) # 设置child表的字段parent_id为外键关联到parent表的id class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
name = Column(String(64))
children = relationship('Child') # 通过关系映射,将children映射到child表,这样可以查到父亲下有几个儿子了, ret = session.query(Parent).filter(Parent.id ==1).one()
print(ret)
print(ret.children)
print(ret.children[0].name)

python之 sqlalchemy的更多相关文章

  1. 基于Python的SQLAlchemy的操作

    安装 在Python使用SQLAlchemy的首要前提是安装相应的模块,当然作为python的优势,可以到python安装目录下的scripts下,同时按住shift+加上鼠标左键,从而在菜单中打开命 ...

  2. SQLAlchemy(1) -- Python的SQLAlchemy和ORM

    Python的SQLAlchemy和ORM(object-relational mapping:对象关系映射) web编程中有一项常规任务就是创建一个有效的后台数据库.以前,程序员是通过写sql语句, ...

  3. python使用sqlalchemy连接pymysql数据库

    python使用sqlalchemy连接mysql数据库 字数833 阅读461 评论0 喜欢1 sqlalchemy是python当中比较出名的orm程序. 什么是orm? orm英文全称objec ...

  4. python之SQLAlchemy

    ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为 ...

  5. Python’s SQLAlchemy vs Other ORMs[转发 7] 比较结论

    Comparison Between Python ORMs For each Python ORM presented in this article, we are going to list t ...

  6. Python’s SQLAlchemy vs Other ORMs[转发 6]SQLAlchemy

    SQLAlchemy SQLAlchemy is an open source SQL toolkit and ORM for the Python programming language rele ...

  7. Python’s SQLAlchemy vs Other ORMs[转发 3]Django's ORM

    Django's ORM Django is a free and open source web application framework whose ORM is built tightly i ...

  8. Python’s SQLAlchemy vs Other ORMs[转发 2]Storm

    Storm Storm is a Python ORM that maps objects between one or more databases and Python. It allows de ...

  9. Python’s SQLAlchemy vs Other ORMs[转发 0]

    原文地址:http://pythoncentral.io/sqlalchemy-vs-orms/ Overview of Python ORMs As a wonderful language, Py ...

  10. Python’s SQLAlchemy vs Other ORMs[转发 1]SQLObject

    SQLObject SQLObject is a Python ORM that maps objects between a SQL database and Python. It is becom ...

随机推荐

  1. css之div等继承问题--待续

    div哪些属性是可以继承的呢? 亲测:float可以继承(错的,见下解答,),display不可以继承.有待继续学习. float不可以继承, 简单来说:浮动的元素,顾名思义,就是这个元素“浮起来”了 ...

  2. 最终解决 mouseenter, mouseleave , mouseout mousehover mousemove等事件的区别?

    在jquery中, html页面的div的显示和隐藏, 修改等的功能, 最终都要由 事件 触发来引用, 不管是键盘事件, 还是鼠标事件... mouseenter和mouseleave是成对对应的, ...

  3. 深入理解IoC/DI

    ------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...

  4. PHP函数call_user_func和call_user_func_array详解

    今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的: call_user_func_array (P ...

  5. PHP如何获取二个日期的相差天数?

    我们经常需要获取二个日期之间相差的天数,方便客户知道距离某个时间段是相差了多少天数,这样的显示结果现在是越来越流行的了.不再像以前那样呆板的显示日期的了.我们这里就分享了二种方法可以获取到二个日期之间 ...

  6. Spring面试题

    69道Spring面试题和答案 原文地址    译者:深海(1422207401@qq.com)  校对:方腾飞 目录 Spring 概述 依赖注入 Spring beans Spring注解 Spr ...

  7. 基于jquery fly插件实现加入购物车抛物线动画效果,jquery.fly.js

    在购物网站中,加入购物车的功能是必须的功能,有的网站在用户点击加入购物车按钮时,就会出现该商品从点击出以抛物线的动画相似加入购物车,这个功能看起来非常炫,对用户体验也有一定的提高.下面介绍基于jque ...

  8. C#高级编程笔记 2016年10月8日运算符和类型强制转换

    1.checked和unchecked 运算符 C#提供了checked 和uncheckde 运算符.如果把一个代码块标记为checked, CLR就会执行溢出检查,如果发生溢出,就抛出overfl ...

  9. 【Eclipse】总结自己在工作中经常使用到的Eclipse快捷键

    一些我觉得比较有用的快捷键,仅作参考. 1.alt + shift + c :更改方法签名. 2.三次鼠标左键单击: 选中一整行. 3.alt + shift + d/x: 再按t : 运行junit ...

  10. 委托 与 Lambda

    一.委托调用方式 1. 最原始版本: delegate string PlusStringHandle(string x, string y); class Program { static void ...