python学习--day12

一、SQLAlchemy

SQLAlchemy 是python 操作数据库的一个库,能够进行 orm 映射。

1. orm

orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候直接使用编程语言对象模型进行操作就可以了,而不用直接使用sql语言。

2. 使用SQLAlchemy操作MySQL

  • 创建连接
  • 声明映射文件
  • 创建模式
  • 初始化映射类实例
  • 创建回话
  • 持久化实例对象

3. SQLAlchemy创建表

首先通过create_engine创建一个连接引擎,echo=true可以打印出后台操作的SQL语句,在SQLAlchemy中通过Declarative完成类与表的映射,通过declarative_base()创建一个基类,然后程序可以基于这个基类创建用户的自定义类,在自定义类中定义表结构(表名、列名、列的类型等)。

 1 #创建连接引擎
 2 engine = create_engine(‘mysql+pymysql://root:[email protected]/py14‘,encoding = ‘utf-8‘,echo = True)
 3 #创建表基类
 4 Base = declarative_base()
 5
 6 class User(Base):
 7     __tablename__ = ‘user‘#表名
 8     #表中的列名
 9     id = Column(Integer,primary_key=True)
10     name = Column(String(32))
11     password = Column(String(64))
12
13     def __repr__(self):
14         return ‘<%s name:%s>‘%(self.id,self.name)

此时数据库中还没有创建user表,需要调用Metadata。create_all()方法,完成数据表的创建,将上面创建的连接引擎作为参数传入

Base.metadata.create_all(engine)

session是ORM与数据库连接的入口,将session与engine绑定,就可以调用session的方法对数据库表进行增删改查等操作了

#创建回话
Session_class = sessionmaker(bind = engine)
session = Session_class()
user_obj = User(name = ‘jim‘,password = ‘123‘)
print(user_obj.name,user_obj.id)
session.add(user_obj)
session.commit()

4. SQLAlchemy对表进行增删改查

(1)查询

执行查询可以使用Session的query函数,all()函数返回查询的所有元组的list,first()返回至多一条记录。filter或filter_by函数用来对筛选查询条件,filter_by只适用于精确查询,filter适用于模糊查询。

1 users = session.query(User).all()
2 user1 = session.query(User).filter_by(name = ‘jim‘).first()
3
4 print(users)
5 print(user1.name,user1.password)
6
7 session.commit()

(2)修改数据

可以直接通过实例名称.属性名=  更新值

user1.name = ‘rain‘
user1.password = ‘1234‘

(3)删除数据通过Session的delete()函数

session.delete(user4)
session.commit()

二、 多表关联

       由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多、多对多等功能。

1. 一对多关联

 1 class Student(Base):
 2     __tablename__ = "student"
 3     id = Column(Integer, primary_key=True)
 4     name = Column(String(32),nullable=False)
 5     register_date = Column(DATE,nullable=False)
 6
 7     def __repr__(self):
 8         return "<%s name:%s>" % (self.id, self.name)
 9
10 class StudyRecord(Base):
11     __tablename__ = "study_record"
12     id = Column(Integer, primary_key=True)
13     day = Column(Integer,nullable=False)
14     status = Column(String(32),nullable=False)
15     stu_id = Column(Integer,ForeignKey("student.id"))
16     #study_obj = query(id=1)
17     #student = query(Student).filter(Student.id == stu_obj.stu_id).first()
18     student = relationship("Student", backref="my_study_record") #允许你在student表里通过backref字段反向查出所有它在study_record表里的关联项
19
20     def __repr__(self):
21         return "<%s day:%s status:%s>" % (self.student.name, self.day,self.status)
22
23 Base.metadata.create_all(engine)  # 创建表结构

1 stu_obj = session.query(Student).filter(Student.name=="alex").first()
2 print(stu_obj.my_study_record)
3 print(‘----------------------------------‘)
4 sr = session.query(StudyRecord).filter(StudyRecord.day == 1).all()
5 print(sr)
6 session.commit()

ORM通过relationship()函数和foreignkey将student和study_record关联起来,在Study_Record中定义student属性,可以通过Study_Record.student属性查询对应的所有student对象,同样也在Student中建立了my_study_record属性,可以通过Student.my_sudy_record查询Student对应的所有Study_Record集合。

2. 多对多关联

例如有两张表分别是作者表和书籍表,一个作者可以写好多书,一本书可以好多作者。此时需要创建第三张表来存储两者的关联关系,这张表是未映射的(也就是没有一个Python类与之对应)

 1 Base = declarative_base()  # 生成orm基类
 2 book_m2m_author = Table(‘book_m2m_author‘, Base.metadata,
 3                         Column(‘book_id‘, Integer, ForeignKey(‘books.id‘)),
 4                         Column(‘author_id‘, Integer, ForeignKey(‘authors.id‘)),
 5                         )
 6
 7
 8 class Book(Base):
 9     __tablename__ = ‘books‘
10     id = Column(Integer, primary_key=True)
11     name = Column(String(64))
12     pub_date = Column(DATE)
13     authors = relationship(‘Author‘, secondary=book_m2m_author, backref=‘books‘)
14
15     def __repr__(self):
16         return self.name
17
18
19 class Author(Base):
20     __tablename__ = ‘authors‘
21     id = Column(Integer, primary_key=True)
22     name = Column(String(32))
23
24     def __repr__(self):
25         return self.name
26
27
28 Session_class = sessionmaker(bind=engine)  # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
29 s = Session_class()  # 生成session实例
30
31 b1 = Book(name="跟Alex学Python")
32 b2 = Book(name="跟Alex学java")
33 b3 = Book(name="跟Alex学linux")
34 b4 = Book(name="跟Rain学mysql")
35
36 a1 = Author(name="Alex")
37 a2 = Author(name="Jack")
38 a3 = Author(name="Rain")
39
40 b1.authors = [a1, a2]
41 b2.authors = [a1, a2, a3]
42
43 s.add_all([b1, b2, b3, b4, a1, a2, a3])
44
45 s.commit()

在relationship()函数中多了secondary参数,这个参数指向了中间表(原文为associated table)。这个中间表只包含了指向多对多关系两侧的表的主键的列。

1 aut = s.query(Author).filter(Author.name ==‘Alex‘).first()
2 print(aut.name,aut.books)
时间: 2024-11-08 21:58:47

python学习--day12的相关文章

python学习day12

装饰器 ef wrapper(func): #wrapper装饰器的名字 def inner(*args,**kwargs): #print('被装饰的函数执行之前你要做的事儿') print('你正在调用%s函数'%func.__name__) ret = func(*args,**kwargs) #被装饰的函数 #print('被装饰的函数执行之后你要做的事儿') return ret return inner @wrapper def welcome(name): print('welco

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

python学习第二天

python学习的第二天就是个灾难啊,这天被打击了,自己写的作业被否认了,不说了,写博客还是个好习惯的,要坚持下去,就不知道能坚持到什么时候.呵呵!!! 这天教的知识和第一天的知识相差不大,区别在于比第一天讲的更细了(我们是两个老师教的,风格是不一样的),这次也写那些比较细的知识点. python的简介 (1)你的程序一定要有个主文件. (2)对于python,一切事物都是对象,对象基于类创建.#似懂非懂,不过有那么点似懂. 知识点 #__divmod__ 会把两个数字相除的商和余数以元组的方式

[Python 学习] 二、在Linux平台上使用Python

这一节,主要介绍在Linux平台上如何使用Python 1. Python安装. 现在大部分的发行版本都是自带Python的,所以可以不用安装.如果要安装的话,可以使用对应的系统安装指令. Fedora系统:先以root登入,运行 yum install python Ubuntu系统:在root组的用户, 运行 sudo apt-get install python 2. 使用的Python的脚本 Linux是一个以文件为单位的系统,那么我们使用的Python是哪一个文件呢? 这个可以通过指令

python学习之最简单的用户注册及登录验证小程序

文章都是从我的个人博客上粘贴过来的哦,更多内容请点击 http://www.iwangzheng.com 正如很多同学所知道的,楼主开始学习python了,前进的道路曲曲折折,有荆棘也有陷阱,从最简单的小程序写起,每天练习,将python进行到底. 有一点比较别扭的就是python的换行之后空四个空格,ruby都是两个,并且python在方法和循环语句的第一句都要加冒号 mysql> show create table user; mysql> alter table user add sal

python学习--创建模块

昨天做了python客户端和服务器端通信,并把接收到的信息写到数据库,因为对数据库进行操作是个经常调用的行为,所以我想把调用数据库的操作写成一个module来给其它python程序调用,所以将昨天的服务器端程序拆分为两个文件: 1.主程序python.py #!/usr/bin/env python import socket import json import connmysql s = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) h

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

Python学习day5作业-ATM和购物商城

Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆,用户间转帐 支持多用户 管理员可添加账户.指定用户额度.冻结用户等 购物车: 商品信息- 数量.单价.名称 用户信息- 帐号.密码.余额 用户可充值 购物历史信息 允许用户多次购买,每次可购买多件 余额不足时进行提醒 用户退出时 ,输出当次购物信息 用户下次登陆时可查看购物历史 商品列表分级显示 1

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr