一:SqlAlchemy ORM  

ORM:Object Relational Mapping 对象关系映射是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果:

建立在SQL AQI至上,不需要写原生SQL语句,是将对象封装并转成原生语句

Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

  1. MySQL-Python #适用于python 2使用MySQL-python模块
  2. mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
  3.  
  4. pymysql #适用于python 3,因为python 3里面的mysql模块变为pymysql
  5. mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
  6.  
  7. MySQL-Connector #使用mysql connector连接数据库
  8. mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
  9.  
  10. cx_Oracle #连接到oracle数据库
  11. oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
  12.  
  13. 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html

1、使用 sqlalchemy + pymysql创建表:

  1. import pymysql
  2. from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
  3. metadata = MetaData()
  4. #创建user和color两个表,metadata封装语句
  5. user = Table('user', metadata,
  6. Column('id', Integer, primary_key=True),
  7. Column('name', String(20)),
  8. )
  9. color = Table('color', metadata,
  10. Column('id', Integer, primary_key=True),
  11. Column('name', String(20)),
  12. )
  13. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test", max_overflow=5) #连接到数据库,最大连接池5个
  14. metadata.create_all(engine) #创建数据库

2、增加数据:

  1. import pymysql
  2. from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
  3. metadata = MetaData()
  4. user = Table('user', metadata,
  5. Column('id', Integer, primary_key=True),
  6. Column('name', String(20)),
  7. )
  8. color = Table('color', metadata,
  9. Column('id', Integer, primary_key=True),
  10. Column('name', String(20)),
  11. )
  12. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test", max_overflow=5)
  13. conn = engine.connect()
  14. sql = user.insert().values(id=1,name='wu') #id可以不写,会自增
  15. conn.execute(sql)
  16. conn.close()

数据库验证:

3、删除数据:

  1. #/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. import pymysql
  5. from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
  6. metadata = MetaData()
  7. user = Table('user', metadata,
  8. Column('id', Integer, primary_key=True),
  9. Column('name', String(20)),
  10. )
  11. color = Table('color', metadata,
  12. Column('id', Integer, primary_key=True),
  13. Column('name', String(20)),
  14. )
  15. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test", max_overflow=5)
  16. conn = engine.connect()
  17.  
  18. sql1 = user.delete().where(user.c.id == 1) #匹配id为1
  19. sql2 = user.delete().where(user.c.name == 'li') #匹配条件name为li
  20. conn.execute(sql1) #执行语句
  21. conn.execute(sql2)
  22. conn.close()

4、改数据:

  1. import pymysql
  2. from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
  3. metadata = MetaData()
  4. user = Table('user', metadata,
  5. Column('id', Integer, primary_key=True),
  6. Column('name', String(20)),
  7. )
  8. color = Table('color', metadata,
  9. Column('id', Integer, primary_key=True),
  10. Column('name', String(20)),
  11. )
  12. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test", max_overflow=5)
  13. conn = engine.connect()
  14.  
  15. #sql1 = user.insert().values(name="zhang") #添加数据
  16. sql1 = user.update().where(user.c.name == 'zhang').values(name='jack') #匹配套件并改数据
  17. conn.execute(sql1)
  18. conn.close()

5、查数据:

  1. #/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. import pymysql
  5. from sqlalchemy import create_engine, select,Table, Column, Integer, String, MetaData, ForeignKey
  6. metadata = MetaData()
  7. user = Table('user', metadata,
  8. Column('id', Integer, primary_key=True),
  9. Column('name', String(20)),
  10. )
  11. color = Table('color', metadata,
  12. Column('id', Integer, primary_key=True),
  13. Column('name', String(20)),
  14. )
  15. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test", max_overflow=5)
  16. conn = engine.connect()
  17. sql = select([user,])
  18. res = conn.execute(sql)
  19. print(res.fetchall())
  20. conn.close()

实际使用方法介绍:

创建表并插入数据:

  1. #/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. from sqlalchemy import create_engine
  5. from sqlalchemy.ext.declarative import declarative_base
  6. from sqlalchemy import Column, Integer, String
  7. from sqlalchemy.orm import sessionmaker
  8.  
  9. Base = declarative_base() #生成一个SqlORM 基类
  10. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test",echo=True)
  11.  
  12. class Host(Base):
  13. __tablename__ = 'hosts'
  14. id = Column(Integer,primary_key=True,autoincrement=True)
  15. hostname = Column(String(64),unique=True,nullable=False)
  16. ip_addr = Column(String(128),unique=True,nullable=False)
  17. port = Column(Integer,default=22)
  18.  
  19. Base.metadata.create_all(engine) #创建所有表结构
  20.  
  21. if __name__ == '__main__':
  22. SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
  23. session = SessionCls()
  24. h1 = Host(hostname='localhost',ip_addr='127.0.0.1')
  25. h2 = Host(hostname='Centos',ip_addr='192.168.10.254',port=2021)
  26. session.add_all([h1,h2])
  27. session.commit() #提交

查询并更改数据:

  1. #/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. from sqlalchemy import create_engine
  5. from sqlalchemy.ext.declarative import declarative_base
  6. from sqlalchemy import Column, Integer, String
  7. from sqlalchemy.orm import sessionmaker
  8.  
  9. Base = declarative_base() #生成一个SqlORM 基类
  10. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test",echo=True)
  11.  
  12. class Host(Base):
  13. __tablename__ = 'hosts'
  14. id = Column(Integer,primary_key=True,autoincrement=True)
  15. hostname = Column(String(64),unique=True,nullable=False)
  16. ip_addr = Column(String(128),unique=True,nullable=False)
  17. port = Column(Integer,default=22)
  18.  
  19. Base.metadata.create_all(engine) #创建所有表结构
  20.  
  21. if __name__ == '__main__':
  22. SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
  23. session = SessionCls()
  24. h1 = Host(hostname='localhost',ip_addr='127.0.0.1')
  25. h2 = Host(hostname='Centos',ip_addr='192.168.10.254',port=2021)
  26. session.add_all([h1,h2])
  27.  
  28. #session.rollback()
  29. #h3 = Host(hostname='ubuntu2',ip_addr='192.168.2.244',port=20000)
  30. #session.add(h3)
  31. #session.add_all( [h1,h2])
  32. #h2.hostname = 'ubuntu_test' #只要没提交,此时修改也没问题
  33.  
  34. res = session.query(Host).filter(Host.hostname.in_(['ubuntu2','localhost'])).first() #all所有,first第一个,last最后一个
  35.  
  36. #res.hostname = "test hostname" #将查到的数据改值
  37. session.delete(res) #删除查询到的数据
  38. session.commit() #提交

ORM 外键关联多对多: 一个组可以包含多个主机,一个主机也可以在多个组,即一个主机可以在多个组里面,如下:

  1. class Parent(Base): #父类
  2. __tablename__ = 'parent'
  3. id = Column(Integer, primary_key=True)
  4. children = relationship("Child")
  5.  
  6. class Child(Base): #子类
  7. __tablename__ = 'child' #定义表名称
  8. id = Column(Integer, primary_key=True) #id的值类型
  9. parent_id = Column(Integer, ForeignKey('parent.id')) #关联父类的'parent.id即可完成与父类的外键关联

测试;

sqlalchemy无法在已经存在的表里面增加新的字段,因此可以将表删除重新创建,或自己使用原生SQL语句创建,也可以使用sqlalchemy的三方工具,我们这里将以前的表删除再重建:

  1. mysql> drop tables hosts;
  2. Query OK, 0 rows affected (0.22 sec)

Pyhton 代码:

  1. #/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. from sqlalchemy import create_engine,ForeignKey
  5. from sqlalchemy.ext.declarative import declarative_base
  6. from sqlalchemy import Column, Integer, String
  7. from sqlalchemy.orm import sessionmaker
  8.  
  9. Base = declarative_base() #生成一个SqlORM 基类
  10. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test",echo=True)
  11.  
  12. class Host(Base):
  13. __tablename__ = 'hosts'
  14. id = Column(Integer,primary_key=True,autoincrement=True)
  15. hostname = Column(String(64),unique=True,nullable=False)
  16. ip_addr = Column(String(128),unique=True,nullable=False)
  17. port = Column(Integer,default=22)
  18. group_id = Column(Integer, ForeignKey('group.id'))
  19.  
  20. class Group(Base):
  21. __tablename__ = 'group'
  22. id = Column(Integer,primary_key=True)
  23. name = Column(String(64),unique=True,nullable=False)
  24. child_id = Column(Integer)
  25. Base.metadata.create_all(engine) #创建所有表结构
  26.  
  27. if __name__ == '__main__':
  28. SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
  29. session = SessionCls()
  30. session.commit() #提交

验证:

  1. mysql> desc hosts;
  2. +----------+--------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +----------+--------------+------+-----+---------+----------------+
  5. | id | int(11) | NO | PRI | NULL | auto_increment |
  6. | hostname | varchar(64) | NO | UNI | NULL | |
  7. | ip_addr | varchar(128) | NO | UNI | NULL | |
  8. | port | int(11) | YES | | NULL | |
  9. | group_id | int(11) | YES | MUL | NULL | |
  10. +----------+--------------+------+-----+---------+----------------+
  11. 5 rows in set (0.01 sec)
    #group_id 行的Key的值是Mul

查看group表:

  1. mysql> desc test.group;
  2. +----------+-------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +----------+-------------+------+-----+---------+----------------+
  5. | id | int(11) | NO | PRI | NULL | auto_increment |
  6. | name | varchar(64) | NO | UNI | NULL | |
  7. | child_id | int(11) | YES | | NULL | |
  8. +----------+-------------+------+-----+---------+----------------+
  9. 3 rows in set (0.01 sec)

创建关联的数据:

  1. #/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. from sqlalchemy import create_engine,ForeignKey
  5. from sqlalchemy.ext.declarative import declarative_base
  6. from sqlalchemy import Column, Integer, String
  7. from sqlalchemy.orm import sessionmaker
  8.  
  9. Base = declarative_base() #生成一个SqlORM 基类
  10. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test",echo=True)
  11.  
  12. class Host(Base):
  13. __tablename__ = 'hosts'
  14. id = Column(Integer,primary_key=True,autoincrement=True)
  15. hostname = Column(String(64),unique=True,nullable=False)
  16. ip_addr = Column(String(128),unique=True,nullable=False)
  17. port = Column(Integer,default=22)
  18. group_id = Column(Integer, ForeignKey('group.id'))
  19.  
  20. class Group(Base):
  21. __tablename__ = 'group'
  22. id = Column(Integer,primary_key=True)
  23. name = Column(String(64),unique=True,nullable=False)
  24. child_id = Column(Integer)
  25.  
  26. Base.metadata.create_all(engine) #创建所有表结构
  27.  
  28. if __name__ == '__main__':
  29. SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
  30. session = SessionCls()
  31.  
  32. g3 = Group(name='g3')
  33. session.add_all([g3,])
  34. h1 = Host(hostname='localhost',ip_addr='1.1.1.1',group_id=g3.id) #由于数据库还没有g3的内容,所以这样关联不成功
  35. session.add_all([h1,])
  36. session.commit() #提交

更改关联数据:

  1. #/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. from sqlalchemy import create_engine,ForeignKey
  5. from sqlalchemy.ext.declarative import declarative_base
  6. from sqlalchemy import Column, Integer, String
  7. from sqlalchemy.orm import sessionmaker
  8.  
  9. Base = declarative_base() #生成一个SqlORM 基类
  10. engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test",echo=True)
  11.  
  12. class Host(Base):
  13. __tablename__ = 'hosts'
  14. id = Column(Integer,primary_key=True,autoincrement=True)
  15. hostname = Column(String(64),unique=True,nullable=False)
  16. ip_addr = Column(String(128),unique=True,nullable=False)
  17. port = Column(Integer,default=22)
  18. group_id = Column(Integer, ForeignKey('group.id'))
  19.  
  20. class Group(Base):
  21. __tablename__ = 'group'
  22. id = Column(Integer,primary_key=True)
  23. name = Column(String(64),unique=True,nullable=False)
  24. child_id = Column(Integer)
  25.  
  26. Base.metadata.create_all(engine) #创建所有表结构
  27.  
  28. if __name__ == '__main__':
  29. SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
  30. session = SessionCls()
  31. g3 = session.query(Group).filter(Group.name=='g3').first() #查到一个已经存在的组
  32. h = session.query(Host).filter(Host.hostname=='localhost').update({'group_id': g3.id}) #查到一个主机的信息并更新其group_id为上一步查到的组的id,即完成了外键的管理
  33. session.commit() #提交

python成长之路13的更多相关文章

  1. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  2. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】

    [写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...

  3. 【Python成长之路】装逼的一行代码:快速共享文件

    [Python成长之路]装逼的一行代码:快速共享文件 2019-10-26 15:30:05 华为云 阅读数 335 文章标签: Python编程编程语言程序员Python开发 更多 分类专栏: 技术 ...

  4. python成长之路第三篇(1)_初识函数

    目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...

  5. 我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)

    2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算 ...

  6. 我的Python成长之路---第三天---Python基础(13)---2016年1月16日(雾霾)

    五.Python的常用的内置函数 Python为我们准备了大量的内置函数,如下图所示 这里我们只讨论红框内的内置函数 abs(x) 返回一个数的绝对值(模),参数可以是真说或浮点数 >>& ...

  7. Python成长之路第二篇(1)_数据类型内置函数用法

    数据类型内置函数用法int 关于内置方法是非常的多这里呢做了一下总结 (1)__abs__(...)返回x的绝对值 #返回x的绝对值!!!都是双下划线 x.__abs__() <==> a ...

  8. python成长之路【第九篇】:网络编程

    一.套接字 1.1.套接字套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Commun ...

  9. python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-has ...

随机推荐

  1. float 浮点数与零值0比较大小

    float x: 千万不要写x==0; 写出float x 与“零值”比较的if语句——一道面试题分析 写出float  x 与“零值”比较的if语句 请写出 float  x 与“零值”比较的 if ...

  2. Device Mapper Multipath(DM-Multipath)

    Device Mapper Multipath(DM-Multipath)能够将server节点和存储阵列之间的多条I/O链路配置为一个单独的设备.这些I/O链路是由不同的线缆.交换机.控制器组成的S ...

  3. Python3.2官方文档翻译--作用域和命名空间

    6.2 Python作用域和命名空间 在介绍类之前.首先我想告诉你一些关于python作用域的规则. 类的定义很巧妙地运用了命名空间,你须要知道范围和命名空间的工作原理以能全面了解接下来发生的. 顺便 ...

  4. opengl模板缓冲区

    相信大家有些人对opengl的模板缓冲区不是很理解,包括我最开始也是,opengl的模板缓冲区其实就是采用过滤的技术来控制那些颜色可以绘制,那些不能进行绘制.这里的过滤技术也就是我们的一个控制方法,主 ...

  5. 关于js封装框架类库之选择器引擎(二)

    在上篇介绍了选择器的获取标签.id.类名的方法,现在我们在上篇基础上继续升级 1.问题描述:上篇get('选择器')已经实现,如果get方法里是一个选择器的父元素,父元素是DOM对象,那么如何获取元素 ...

  6. Linux新手笔记 sudo

    centos 6.4 32bit 你是也像我一样,厌烦了在root用户和个人用户之间来回切换.或者干脆直接用root用户.可以这样设置,然后在命令前加sudo 即可使用自己到密码,临时用root身份执 ...

  7. 关于tableView刷新

    UITabelView的局部刷新 1. 刷新整个tableView用[self.tableView reloadData]; 2. [self.tableView reloadRowsAtIndexP ...

  8. C++重载赋值运算符

    这是一道C++的面试题,下面在这篇博客中分析一下这个问题.先上题目: //题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: ...

  9. jbpmAPI-5

    Part II. jBPM Core 5.1.概述本章介绍了API需要加载过程和执行它们.更多的细节如何定义过程本身,看看在BPMN 2.0章.与流程引擎交互(例如,开始一个过程),你需要建立一个会话 ...

  10. 从PHP程序员到RAW开发~

    RAW是一款PHP网站开发系统,即使不懂PHP,也可以使用RAW进行PHP程序开发,当然如果已经掌握了PHP,那么使用RAW开发将会是如虎添翼! 怎么理解“如虎添翼”:我们平时要做一个项目的话,我们要 ...