python成长之路13
一: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模块变为pymysql
mysql+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 sessionmaker Base = 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 sessionmaker Base = 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 sessionmaker Base = 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 sessionmaker Base = 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 sessionmaker Base = 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() #提交

python成长之路13的更多相关文章
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
[写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...
- 【Python成长之路】装逼的一行代码:快速共享文件
[Python成长之路]装逼的一行代码:快速共享文件 2019-10-26 15:30:05 华为云 阅读数 335 文章标签: Python编程编程语言程序员Python开发 更多 分类专栏: 技术 ...
- python成长之路第三篇(1)_初识函数
目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...
- 我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)
2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算 ...
- 我的Python成长之路---第三天---Python基础(13)---2016年1月16日(雾霾)
五.Python的常用的内置函数 Python为我们准备了大量的内置函数,如下图所示 这里我们只讨论红框内的内置函数 abs(x) 返回一个数的绝对值(模),参数可以是真说或浮点数 >>& ...
- Python成长之路第二篇(1)_数据类型内置函数用法
数据类型内置函数用法int 关于内置方法是非常的多这里呢做了一下总结 (1)__abs__(...)返回x的绝对值 #返回x的绝对值!!!都是双下划线 x.__abs__() <==> a ...
- python成长之路【第九篇】:网络编程
一.套接字 1.1.套接字套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Commun ...
- python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作
打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-has ...
随机推荐
- 三种客户端访问wcf服务端的方法 C#
原文 http://blog.csdn.net/zlj002/article/details/7914556 string jsonstr = String.Empty; string url = & ...
- 简单makefile的写法
一个项目下的文件比较多,如果单个的输入,比较费劲,所以就需要把编译过程写进一个MakeFile文件中. 下面建立5个文件,3个cxx文件,2个hxx头文件 //filename main.cxx #i ...
- U盘重装系统win7
步骤: 1开机f12进入bios模式设置光盘的第一驱动 2U盘拷贝好的ghost镜像插入usb接口,重启默认U盘启动 3启动后进入重装系统界面,选择要重新的系统,进入pe系统,格式化c盘,后面默认自动
- poj 1815 Friendship (最小割+拆点+枚举)
题意: 就在一个给定的无向图中至少应该去掉几个顶点才干使得s和t不联通. 算法: 假设s和t直接相连输出no answer. 把每一个点拆成两个点v和v'',这两个点之间连一条权值为1的边(残余容量) ...
- selenium 学习笔记 ---新手学习记录(3) 问题总结(java)
1.验证码简单处理 /** * 验证码等待输入函数 * */ private void ZcYzm(WebDriver driver){ boolean flag=false; while(flag= ...
- mabatis mapper开发规范
定义一个mapper接口 package mapper; import pojo.User; public interface UserMapper { public User getUser(int ...
- Linux第三方源
由于版权等各方面原因,很多时候在基础安装完Linux后,满多软件并不包含在yum(对于Ubuntu可能是apt-get)源中. 因此可以去下载第三方源,安装下载第三方软件.当然,如果习惯了源代码编译安 ...
- 17.1.1.9 Introducing Additional Slaves to an Existing Replication Environment 引入额外的Slaves 到一个存在的复制
17.1.1.9 Introducing Additional Slaves to an Existing Replication Environment 引入额外的Slaves 到一个存在的复制环境 ...
- [Windows编程] 开发DLL必读《Best Practices for Creating DLLs》
开发DLL的时候,需要十分注意 DllMain 函数,因为在多线程环境下DLLMain里面的代码很容易引发线程死锁. 这篇MSDN文章<Best Practices for Creating D ...
- C# windows ce编程-----我的第一次
最近公司要求开发抄表软件,软件分为PC端和手持终端(简称HHU),HHU是基于英文版的windows ce6.0操作系统,开发环境要求VS2005+SQLite数据库,开发语言为C#,因为是第一次基本 ...