【Python之路Day12】网络篇之Python操作MySQL
pymysql是Python中操作MySQL的模块,使用方法和MySQLDB几乎一样。
1. 执行SQL语句
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: DBQ(Du Baoqiang) import pymysql #导入模块 #创建连接
conn = pymysql.connect(
host='172.16.30.162', #主机IP
port=3306, #端口
user='tom', #连接数据库用户
password='tom123', #连接密码
db='db1' #连接的数据库名称
) #创建游标
cursor = conn.cursor() #执行SQL,并返回受影响的行数
effect_row = cursor.execute("UPDATE tb1 SET host='1.1.1.1'") # 执行SQL,并返回受影响行数
#effect_row = cursor.execute("UPDATE tb1 SET host='1.1.1.2' WHERE id > %s",(1,)) # 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("INSERT INTO tb1(host) VALUES(%s),(%s)", [("1.1.1.11",1),("1.1.1.11",1)]) print(effect_row)
# 提交,不然无法保存新建或者修改的数据
conn.commit() # 关闭游标
cursor.close() # 关闭连接
conn.close()
2 获取查询数据
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: DBQ(Du Baoqiang) import pymysql #导入模块 #创建连接
conn = pymysql.connect(
host='172.16.30.162', #主机IP
port=3306, #端口
user='tom', #连接数据库用户
password='tom123', #连接密码
db='db1' #连接的数据库名称
) # #创建游标
cursor = conn.cursor() cursor.execute("SELECT * FROM tb1") #获取第一行数据
row_1 = cursor.fetchone() #获取前N行数据
row_2 = cursor.fetchmany(3) #获取所有数据
row_3 = cursor.fetchall() conn.commit()
cursor.close()
conn.close() print(row_1) #游标的位置会变的,获取了第一行之后,游标就到第二行位置了
print(row_2) #因此打印前三行的时候,是打印的2,3,4
print(row_3) #同理,打印所有的,实际上是当前游标到最后的位置 #代码执行结果:
(1, '1.1.1.1')
((2, '1.1.1.2'), (3, '1.1.1.2'), (4, '1.1.1.11'))
((5, ''), (6, '1.1.1.11'), (7, ''), (8, '1.1.1.11'), (9, ''), (10, '1.1.1.11'), (11, ''), (12, '1.1.1.30'), (13, '1.1.1.30'))
3、fetch数据类型
#!/usr/bin/env python3
# -*- coding: utf-8 -*- import pymysql #导入模块 #创建连接
conn = pymysql.connect(
host='172.16.30.162', #主机IP
port=3306, #端口
user='tom', #连接数据库用户
password='tom123', #连接密码
db='db1' #连接的数据库名称
) # #创建游标, 并设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("select * from tb1") result = cursor.fetchone() print(result) conn.commit()
cursor.close()
conn.close() #执行结果:
{'host': '1.1.1.1', 'id': 1}
SQLAlchemy
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射来操作数据库。简而言之,就是将对象转换为SQL语句,然后使用数据API执行SQL并获取执行结果。
SQLAlchemy本身无法操作数据库,其必须以pymysql等第三方插件。
Dialect用于和数据API交互,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如下代码:
二. ORM功能的使用
1. 创建表
#!/usr/bin/env python3
# -*- coding: utf-8 -*- from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer,String, ForeignKey,UniqueConstraint,Index
from sqlalchemy.orm import sessionmaker,relationships
from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://tom:tom123@172.16.30.162:3306/db1",max_overflow=5) Base = declarative_base() #创建一个单表
class Users(Base):
'''
一定要继承Base
'''
__tablename__ = 'users' #表名为users
id = Column(Integer,primary_key=True) #id列, 整数数据类型, 主键
name = Column(String(32)) #name列, 字符串类型, 长度32
extra = Column(String(20)) #extra列,字符串类型,长度20 __table_args__ = (
UniqueConstraint('id','name',name='unx_id_name'),
Index('ix_id_name','name','extra')
) #一对多
class Favor(Base):
__tablename__ = 'favor'
nid = Column(Integer,primary_key=True)
caption = Column(String(50),default='red',unique=True) class Person(Base):
'''
通过外键关联favor表的nid实现一对多
'''
__tablename__ = 'person'
nid = Column(Integer,primary_key=True)
name = Column(String(32),index=True,nullable=True)
favor_id = Column(Integer, ForeignKey('favor.nid')) #外键,关联favor表的nid #多对多
class Group(Base):
__tablename__ = 'group'
id = Column(Integer,primary_key=True)
name = Column(String(64),unique=True,nullable=True)
port = Column(Integer,default=22) class Server(Base):
__tablename__ = 'server'
id = Column(Integer,primary_key=True,autoincrement=True)
hostname = Column(String(64),unique=True,nullable=False) class ServerToGroup(Base):
'''
servertogroup这个表存放上述两个表的对应关系,可以多对多
'''
__tablename__ = 'servertogroup'
nid = Column(Integer,primary_key=True,autoincrement=True)
server_id = Column(Integer,ForeignKey('server.id'))
group_id = Column(Integer,ForeignKey('group.id')) def init_db():
Base.metadata.create_all(engine) def drop_db():
Base.metadata.drop_all(engine) #init_db() #创建所有表
#drop_db() #删除所有表
2 操作表
#!/usr/bin/env python3
# -*- coding: utf-8 -*- from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer,String, ForeignKey,UniqueConstraint,Index
from sqlalchemy.orm import sessionmaker,relationships
from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://tom:tom123@172.16.30.162:3306/db1",max_overflow=5) Base = declarative_base() #创建一个单表
class Users(Base):
'''
一定要继承Base
'''
__tablename__ = 'users' #表名为users
id = Column(Integer,primary_key=True) #id列, 整数数据类型, 主键
name = Column(String(32)) #name列, 字符串类型, 长度32
extra = Column(String(20)) #extra列,字符串类型,长度20 __table_args__ = (
UniqueConstraint('id','name',name='unx_id_name'),
Index('ix_id_name','name','extra')
) def __repr__(self):
return "%s-%s"%(self.id, self.name) #一对多
class Favor(Base):
__tablename__ = 'favor'
nid = Column(Integer,primary_key=True)
caption = Column(String(50),default='red',unique=True) def __repr__(self):
return "%s-%s" %(self.nid, self.caption) class Person(Base):
'''
通过外键关联favor表的nid实现一对多
'''
__tablename__ = 'person'
nid = Column(Integer,primary_key=True)
name = Column(String(32),index=True,nullable=True)
favor_id = Column(Integer, ForeignKey('favor.nid')) #外键,关联favor表的nid
#与生成表结构无关, 仅用于查询方便
#favor = relationships('Favor',backref = 'pers') #多对多
class Group(Base):
__tablename__ = 'group'
id = Column(Integer,primary_key=True)
name = Column(String(64),unique=True,nullable=True)
port = Column(Integer,default=22)
#group = relationships('Group',secondary=ServerToGroup,backref='host_list') class Server(Base):
__tablename__ = 'server'
id = Column(Integer,primary_key=True,autoincrement=True)
hostname = Column(String(64),unique=True,nullable=False) class ServerToGroup(Base):
'''
servertogroup这个表存放上述两个表的对应关系,可以多对多
'''
__tablename__ = 'servertogroup'
nid = Column(Integer,primary_key=True,autoincrement=True)
server_id = Column(Integer,ForeignKey('server.id'))
group_id = Column(Integer,ForeignKey('group.id'))
#group = relationships('Group',backref='s2g')
#server = relationships('Server',backref='s2g') def init_db():
Base.metadata.create_all(engine) def drop_db():
Base.metadata.drop_all(engine) Session = sessionmaker(bind=engine)
session = Session() 表结构+连接数据库
3 增
obj = Users(name='Tom',extra='mouse')
session.add(obj)
session.add_all([
Users(name='Jerry',extra='Cat'),
Users(name='Sam',extra='Human')
]) session.commit()
删
session.query(Users).filter(Users.id > 4).delete() #删除id>4的用户
session.commit()
改
session.query(Users).filter(Users.id > 3).update({"name":"sb"}) #先将id>3的用户名字改为sb
session.query(Users).filter(Users.id > 3).update({Users.name:Users.name + ''},synchronize_session = False) #而后在sb后拼接一个123 session.query(Users).filter(Users.id > 3).update({"id": Users.id+1},synchronize_session = "evaluate") #最后把大于3的id号+1 session.commit()
查
res = session.query(Users).all() #返回一个列表
print(res)
res1 = session.query(Users.name, Users.extra).all() #返回一个列表,中包含元组
print(res1)
res2 = session.query(Users).filter_by(name='Jerry').all() #返回一个列表
print(res2)
res3 = session.query(Users).filter_by(name='Jerry').first()
print(res3)
session.commit()
其他
#条件
ret = session.query(Users).filter_by(name='Jerry').all()
ret = session.query(Users).filter(Users.id > 1, Users.name == 'Tom').all() #并
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'Sam').all() #id在1-3之间,并且名字是Sam
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all() #id在1,3,4里的
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all() #取反
ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='Sam'))).all() #子查询 from sqlalchemy import and_, or_ ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'Tom')).all() #并
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'Tom')).all() #或
ret = session.query(Users).filter(
or_(
Users.id < 2,
and_(Users.name == 'Sam', Users.id > 3),
Users.extra != ""
)).all() #id<2 或者 用户名是Sam并大于3的 # 通配符
ret = session.query(Users).filter(Users.name.like('J%')).all() #J开头后续任意字符
ret = session.query(Users).filter(~Users.name.like('J%')).all() #取反 # 限制
ret = session.query(Users)[0:5] #显示多少个值,个人感觉有点类似于列表的切片一样 # 排序
ret = session.query(Users).order_by(Users.id.desc()).all() #降序
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all() #升序 # 分组
from sqlalchemy.sql import func ret = session.query(Users).group_by(Users.extra).all() ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).all()
#结果:[(2, Decimal('2'), 2), (3, Decimal('3'), 3), (5, Decimal('5'), 5), (1, Decimal('1'), 1)] ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all() #添加条件最小id大于2 # 连表 ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all() #连表查询, 条件 usersid 等于 Favor.nid
ret = session.query(Person).join(Favor).all() #左连接, 如果要用右连接,可以把两个表的位置换下
#
ret = session.query(Person).join(Favor, isouter=True).all() # 组合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all() q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all() print(ret)
session.commit()
【Python之路Day12】网络篇之Python操作MySQL的更多相关文章
- 【Python之路】第二篇--初识Python
Python简介 Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube.D ...
- Python之路【第一篇】python基础
一.python开发 1.开发: 1)高级语言:python .Java .PHP. C# Go ruby c++ ===>字节码 2)低级语言:c .汇编 2.语言之间的对比: 1)py ...
- Python之路【第一篇】:Python简介和入门
python简介: 一.什么是python Python(英国发音:/ pa θ n/ 美国发音:/ pa θɑ n/),是一种面向对象.直译式的计算机程序语言. 每一门语言都有自己的哲学: pyth ...
- Python之路,第一篇:Python入门与基础
第一篇:Python入门与基础 1,什么是python? Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 2,python的特征: (1)易于学习,易于利用: (2)开 ...
- Python之路【第九篇】:Python面向对象
阅读目录 一.三大编程范式 编程范式即编程的方法论,标识一种编程风格: 大家学习了基本的python语法后,大家可以写python代码了,然后每个人写代码的风格不同,这些不同的风格就代表了不同的流派: ...
- python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy
内容一览: 1.Python操作MySQL数据库 2.ORM sqlalchemy学习 1.Python操作MySQL数据库 2. ORM sqlachemy 2.1 ORM简介 对象关系映射(英语: ...
- Python之路【第二篇】:Python基础
Python基础 对于Python,一切事物都是对象,对象基于类创建 所以,以下这些值都时对象:"zhurui".22.['北京','上海','深圳'],并且是根据不同的类生成的对 ...
- Python之路,第九篇:Python入门与基础9
python3 集合set 集合set概念 集合是可变的容器:满足数学意义上的定义,求并集交集等 集合内的数据对象都是唯一的(不能重复多次) 集合是无序的存储结构,集合中的数据没有先后关系 集合是相 ...
- Python之路,第二篇:Python入门与基础2
1,复合赋值运算符 += . -= . *= . /= . //= . %= , **= x += y 等同于 x = x + y x -= ...
- Python之路(第三篇):Python基本数据类型字符串(二)
一.基本数据类型1.字符串 str字符串方法介绍(二)a --expandtabs( ) expandtabs( ) 把字符串中的 tab 符号('\t')转为空格参数默认为8,注意字符串原有的空格也 ...
随机推荐
- 转:RTC搭建android下三层应用程序访问服务器MsSql-客户端
原文:http://www.cnblogs.com/delphi007/p/3346084.html android下stringgrid已知问题: 通过点击时获取对应行的值有问题,在win下调试正常 ...
- numpy.concatenate
import numpy as np a = np.array([[1, 2], [3, 4]]) a.shape Out[3]: (2, 2) b = np.array([[5, 6]]) b.sh ...
- 在IIS6上部署MVC站点,Nhiernate数据库底层
服务器环境要求: Windows 2003 server + IIS6.0 1.必须安装.net framework 4.0, MVC 2.最好能安装.net framework 的sp1, 我们服务 ...
- C# 接口应用及意义
写在前面:新手入行,读者勉强看看吧,写的不对的欢迎讨论,板砖轻拍! 一.定义 接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接口定义中指定的接口成员. 通常用Interf ...
- 如何让我们的VMware虚拟机上网——转载
一.必须检查你的windows系统的VMware DHCP Service 和VMware NAT Service这个两个服务是否启动.如果未启动请启动. 1,在开始windows里面输入servic ...
- 红星美凯龙CEO车建新的圆融和霸气
待人接物中车建新有许多习惯,与别人一起行走时,走在靠马路的一边:吃饭时最好的菜留给客人.他说,做人往往就在细节中,别小看一个举动,无意中就会感染别人.和别人在一起,你要时时刻刻先考虑对方. 细节上体察 ...
- codeforces731C Socks
C. Socks time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- Linux 夸平台 移植 Win32
1.代码格式 大量的 警告 不识别的字符(936),请保存为unicode 以免丢失数据,好多参考说忽略此警告. 但是很多错误都是由于这个警告引起的.将大量的.h .cpp 的utf 8 数据用txt ...
- ASP.NET ZERO 学习 JTable的ChildTable用法
效果图: Jtable的子表用法: _$masterTable.jtable({ title: app.localize('PharmacyInventory'), openChildAsAccord ...
- (转)SqlBulkCopy批量复制数据
在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们 ...