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. maven project中,在main方法上右键Run as Java Application时,提示错误:找不到或无法加载主类XXX.XXXX.XXX

    新建了一个maven project项目,经过一大堆的修改操作之后,突然发现在main方法上右键运行时,竟然提示:错误:找不到或无法加载主类xxx.xxx.xxx可能原因1.eclipse出问题了,在 ...

  2. [Nhibernate]一级缓存

    目录 写在前面 文档与系列文章 一级缓存 一个例子 一级缓存管理 总结 写在前面 上篇文章介绍了nhibernate中对象的三种状态,通过对象的三种状态,很容易想到缓存. 什麽是缓存? 有时候,某些数 ...

  3. 脑筋急转弯——Google 面试

    1. 村子里有100对夫妻,其中每个丈夫都瞒着自己的妻子偷情...村里的每个妻子都能立即发现除自己丈夫之外的其他男人是否偷情,唯独不知道她自己的丈夫到底有没有偷情.村里的规矩不容忍通奸.任何一个妻子, ...

  4. AndroidStudio导入Library

    1.把它像Module一样导入. File >New >ImportModule(选择你要导入的Library). 如果出现了下面的情况,意思是跟项目中的Module重名,改个名字就行了. ...

  5. tyvj1034 尼克的任务

    描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成.尼克的一个工作日为N分钟,从第一分钟开始到第N ...

  6. PHP错误处理函数set_error_handler()的用法

    定义和用法 set_error_handler() 函数设置用户自定义的错误处理函数. 该函数用于创建运行时期间的用户自己的错误处理方法. 该函数会返回旧的错误处理程序,若失败,则返回 null. 语 ...

  7. 编译安装 Zend Opcache 缓存Opcache,加速 PHP

    Optimizer+ 是 Zend 开发的闭源但可以免费使用的 PHP 优化加速组件,是第一个也是最快的 opcode 缓存工具.现在,Zend 科技公司将 Optimizer+ 在 PHP Lice ...

  8. mysql查询语句select-子查询

    1 子查询定义 在一个表表达中可以调用另一个表表达式,这个被调用的表表达式叫做子查询(subquery),我么也称作子选择(subselect)或内嵌选择(inner select).子查询的结果传递 ...

  9. Angular2 管道

    1. 说明 管道用来转换模板显示的内容,应用程序中经常出现获取数据,转换数据,显示数据的逻辑.管道就是用来在转换数据阶段起作用的.主要存在两种类型的管道,pure pipe和impure pipe 2 ...

  10. Ehlib安装方法有窍门

    Ehlib安装方法有窍门,如果不知道该安装方法,很难成功安装,Delphi 7(D5.D6也如此)中的安装方法       1.把EhLib中的common和DataService文件拷贝到Delph ...