一:SqlAlchemy ORM  

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

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

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

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

MySQL-Python  #适用于python 2使用MySQL-python模块mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>

pymysql #适用于python 3,因为python 3里面的mysql模块变为pymysqlmysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

MySQL-Connector #使用mysql connector连接数据库mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>

cx_Oracle #连接到oracle数据库oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html

1、使用 sqlalchemy + pymysql创建表:

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

2、增加数据:

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

数据库验证:

3、删除数据:

#/usr/bin/env  python
# -*- coding:utf-8 -*-import pymysql
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
metadata = MetaData()
user = Table('user', metadata,Column('id', Integer, primary_key=True),Column('name', String(20)),
)
color = Table('color', metadata,Column('id', Integer, primary_key=True),Column('name', String(20)),
)
engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test", max_overflow=5)
conn = engine.connect()sql1 = user.delete().where(user.c.id == 1) #匹配id为1
sql2 = user.delete().where(user.c.name == 'li') #匹配条件name为li
conn.execute(sql1) #执行语句
conn.execute(sql2)
conn.close()

4、改数据:

import pymysql
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
metadata = MetaData()
user = Table('user', metadata,Column('id', Integer, primary_key=True),Column('name', String(20)),
)
color = Table('color', metadata,Column('id', Integer, primary_key=True),Column('name', String(20)),
)
engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test", max_overflow=5)
conn = engine.connect()#sql1 = user.insert().values(name="zhang") #添加数据
sql1 = user.update().where(user.c.name == 'zhang').values(name='jack') #匹配套件并改数据
conn.execute(sql1)
conn.close()

5、查数据:

#/usr/bin/env  python
# -*- coding:utf-8 -*-import pymysql
from sqlalchemy import create_engine, select,Table, Column, Integer, String, MetaData, ForeignKey
metadata = MetaData()
user = Table('user', metadata,Column('id', Integer, primary_key=True),Column('name', String(20)),
)
color = Table('color', metadata,Column('id', Integer, primary_key=True),Column('name', String(20)),
)
engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test", max_overflow=5)
conn = engine.connect()
sql = select([user,])
res = conn.execute(sql)
print(res.fetchall())
conn.close()

实际使用方法介绍:

创建表并插入数据:

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

查询并更改数据:

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

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

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

测试;

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

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

Pyhton 代码:

#/usr/bin/env  python
# -*- coding:utf-8 -*-from sqlalchemy import create_engine,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from  sqlalchemy.orm import sessionmakerBase = declarative_base() #生成一个SqlORM 基类
engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test",echo=True)class Host(Base):__tablename__ = 'hosts'id = Column(Integer,primary_key=True,autoincrement=True)hostname = Column(String(64),unique=True,nullable=False)ip_addr = Column(String(128),unique=True,nullable=False)port = Column(Integer,default=22)group_id = Column(Integer, ForeignKey('group.id'))class Group(Base):__tablename__ = 'group'id = Column(Integer,primary_key=True)name = Column(String(64),unique=True,nullable=False)child_id = Column(Integer)
Base.metadata.create_all(engine) #创建所有表结构

if __name__ == '__main__':SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例session = SessionCls()session.commit() #提交

验证:

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

查看group表:

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

创建关联的数据:

#/usr/bin/env  python
# -*- coding:utf-8 -*-from sqlalchemy import create_engine,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from  sqlalchemy.orm import sessionmakerBase = declarative_base() #生成一个SqlORM 基类
engine = create_engine("mysql+pymysql://root:zhang@123@localhost:3306/test",echo=True)class Host(Base):__tablename__ = 'hosts'id = Column(Integer,primary_key=True,autoincrement=True)hostname = Column(String(64),unique=True,nullable=False)ip_addr = Column(String(128),unique=True,nullable=False)port = Column(Integer,default=22)group_id = Column(Integer, ForeignKey('group.id'))class Group(Base):__tablename__ = 'group'id = Column(Integer,primary_key=True)name = Column(String(64),unique=True,nullable=False)child_id = Column(Integer)Base.metadata.create_all(engine) #创建所有表结构if __name__ == '__main__':SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例session = SessionCls()
g3 = Group(name='g3')session.add_all([g3,])h1 = Host(hostname='localhost',ip_addr='1.1.1.1',group_id=g3.id) #由于数据库还没有g3的内容,所以这样关联不成功session.add_all([h1,])session.commit() #提交

更改关联数据:

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

转载于:https://www.cnblogs.com/zhang-shijie/p/5336340.html

Python 第十一篇:开发堡垒机相关推荐

  1. python运维实战--跨堡垒机连接二级服务器上传文件

    python运维实战--跨堡垒机连接二级服务器上传文件 paramiko的有关概念和操作 Welcome to Paramiko! - Paramiko documentation 这个python脚 ...

  2. python基础 day13 运维堡垒机开发

    本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功 ...

  3. Python之路【第八篇】:堡垒机实例以及数据库操作

    Python之路[第八篇]:堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于 ...

  4. python数据库管理实例_Python之路【第八篇】:堡垒机实例以及数据库操作

    堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: i ...

  5. python基础学习(九)——堡垒机案例

    笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据 ...

  6. python连接linux堡垒机_Python之路:堡垒机实例以及数据库操作

    一.堡垒机前戏 开发堡垒机之前,先学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作. SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: ...

  7. 堡垒机实例以及数据库操作

    堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作 使用Python语言的paramiko模块编写服务器 ...

  8. 堡垒机前戏:paramiko模块

    一.堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作. paramiko模块 存在的作用:作批量管理用的. 二.SSHClien ...

  9. 为什么开源堡垒机不可取

    运维风险管理系统,行业又称堡垒机,是目前信息化程度和信息安全需求较高的行业应用较为普遍的最新的安全防护技术平台,但是中小企业出于成本考虑,往往无法承担硬件堡垒机动辄数十上百万的费用,那么有没有适合中小 ...

最新文章

  1. Oracle Open World 2012信息汇总贴
  2. python中用来表示赋值的符号是_Python3练习题系列(06)——各种符号总结
  3. Py学生信息管理系统 案例(优化版)
  4. 玩转算法面试-第四章查找值之leetcod相关笔记
  5. (连续子序列)唯一的雪花
  6. C#LeetCode刷题之#400-第N个数字(Nth Digit)
  7. android menu width,如何更改Android PopupMenu宽度
  8. python向上取整_python向上取整-取整,向上
  9. Web移动开发基本概念
  10. (详解)无指针AC自动机
  11. IBM ServerGuide下载地址及安装指南-wugj
  12. 2021年道路运输企业安全生产管理人员考试内容及道路运输企业安全生产管理人员题库
  13. php PDO连接mysql
  14. 华为C语言的编程规范
  15. c语言ab43错误的是,求助,AB+没法玩下去了,详情请看报错代码
  16. Android 支付宝sdk接入问题:不能唤起支付宝客户端,或者偶然唤起支付客户端
  17. 从高级程序员-资深程序员-技术总监,我都为你整理好了学习路径
  18. AndroidStudio配置LitePal时Failed to Resolve
  19. 专访深蓝航天CEO霍亮:做中国版梅林发动机 深耕火箭回收复用赛道
  20. 使用Python实现超级趋势指标(Super Trend Indicator)

热门文章

  1. 产品经理之深度学习促进产品(二)
  2. python输出print(x+y)_Python语句序列“x='car';y=2;print(x+y)”的输出结果是() (2.0分)_学小易找答案...
  3. 我的内核学习笔记9:Intel内部看门狗iTCO_wdt驱动
  4. Centos7没有ip地址
  5. 【Flink】Could not connect to BlobServer at address
  6. 【java】Java 8 - 移除Permgen 使用元空间
  7. 95-10-170-启动-KafkaRequestHandlerPool
  8. DUBBO:前端调用后端服务返回类名
  9. 【Druid IO】Druid的imply方式安装
  10. tomcat--because there was insufficient free space available after evicting expired cache entries