pymysql

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 本篇对于python操作Mysql主要有两种情况   ·原生模块 pymsql   ·ORM框架 SQLAchemy pymysql pymsql是python中操作的MYsql的模块,其使用方法和MySQLdb几乎相同 下载安装   1丶pip3 install pymsql 使用操作:   1·执行SQL   conn= pymsql.

本篇对于python操作Mysql主要有两种情况

  ·原生模块 pymsql

  ·ORM框架 SQLAchemy

pymysql

pymsql是python中操作的MYsql的模块,其使用方法和MySQLdb几乎相同

下载安装

  1丶pip3 install pymsql

使用操作:

  1·执行SQL

 

conn= pymsql.connect(host = "127.0.0.1",post = 3306,user = "root",passwd = "123",db = "t1")
#创建连接

cursor = conn.cursor()
#创建游标

effect_row = cursor.execute("updata host set host = "1.1.1.2"")
#执行SQL,并返回受影响行数

effect_row = cursor.execute("update host set = '1.1.1.2' where nid > %s",(1,))
#执行SQL,并返回受影响行数


effect_row = cursor.executemany("insert info host(host,color_id)values(%s,%s)",[("1.1.1.11",1)("1.1.1.11",2)])
#执行SQL,并返回受影响行数

conn.commit()
#提交,不然无法保存新建或者修改的数据


cursor.close()
#关闭游标


conn.close()
#关闭连接

 

  2丶获取创建数据自增ID

#!/use/bin/evn python
# -*- coding:utf-8 -*-



import pymsql

conn = pymsql.connect(host= "127.0.0.1",port= 3306,user= "root",passwd="123",db="t1")
cursor = conn.cursor()
cursor.executemanty("insert info hosts(host,color_id)values(%s,%s)",[("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()
cursor.colose()
conn.close()



#获取最新自增ID
new_id = cursor.lastrowid

  3丶获取查询数据

#!/use/bin/env python
# -*- coding:utf-8 -*-

import pymsql

conn = pymsql.connect(host="127.0.0.1",post=3306,user='root',passwd='123',db='t1')
cursor = conn.cursor()
cursor.execute('select * from hosts')

row_1 = cursor.fetchone()
#获取第一行数据

row_2 = cursor.fetchmany(3)
#获取前N行数据

row_3 = cursor.fetchall()
#获取所有数据

conn.commit()

cursor.close()

conn.close()

注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  ·cursoe.scroll(1,mode='relative')   #相对当前位置移动

  ·cursor.scroll(2,mode="absolute")   #相对绝对位置移动  

4丶fetch数据类型

  关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:

#!/use/bin/env python
# -*- coding:utf-8 -*-


import pymsql


conn = pymsql.connect(host='127.0.0.1',port=3306,user='root',passwb='12
3',db='t1')


#游标设置为字典类型
cursor = conn.cursor(cursor=pymsql.cursor.DictCursor)
r = cursor.execute("call p1()")

result = cursor.fetchone()

conn.commit()

cursor.close()

conn.close()

 SQLAchemy 

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

安装:

  pip3 install SQLAlchemy

 

SQLAlchemy本身无法操作数据库,其必须依赖pymysql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同,调用不同的数据库API,从而实现对数据库的操作,如;

My SQL - Python 
        mysql+mysldb://<user>:<password>@<host>[:<post>]/<dbname>

pymsql
        mysql+pymsql://<username>:<password>@<host>/<dbname>[?<options>]
MySQL - Connector
        mysql + mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
cx_Oracle
        oracle+cx_oracle://user:pass@host:port/dbname[?key=value*key=value...]



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

一丶内部处理

使用 Engine/ConnectionPooling/Dialect 进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import create_engine
  
  
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
  
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES ('1.1.1.22', 3)"
# )
  
# 新插入行自增ID
# cur.lastrowid
  
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES(%s, %s)",[('1.1.1.22', 3),('1.1.1.221', 3),]
# )
  
  
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES (%(host)s, %(color_id)s)",
#     host='1.1.1.99', color_id=3
# )
  
# 执行SQL
# cur = engine.execute('select * from hosts')
# 获取第一行数据
# cur.fetchone()
# 获取第n行数据
# cur.fetchmany(3)
# 获取所有数据
# cur.fetchall()
View Code

 

二、ORM功能使用

使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

1、创建表

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
 
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
 
Base = declarative_base()
 
# 创建单表
class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))
 
    __table_args__ = (
    UniqueConstraint('id', 'name', name='uix_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):
    __tablename__ = 'person'
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    favor_id = Column(Integer, ForeignKey("favor.nid"))
 
 
# 多对多
class Group(Base):
    __tablename__ = 'group'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)
    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):
    __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)
View Code

注:设置外检的另一种方式 ForeignKeyConstraint(['other_id'], ['othertable.other_id'])

2、操作表

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)

Base = declarative_base()

# 创建单表
class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

    __table_args__ = (
    UniqueConstraint('id', 'name', name='uix_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):
    __tablename__ = 'person'
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    favor_id = Column(Integer, ForeignKey("favor.nid"))
    # 与生成表结构无关,仅用于查询方便
    favor = relationship("Favor", backref='pers')

# 多对多
class ServerToGroup(Base):
    __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 = relationship("Group", backref='s2g')
    server = relationship("Server", backref='s2g')

class Group(Base):
    __tablename__ = 'group'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)
    port = Column(Integer, default=22)
    # group = relationship('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)




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="alex0", extra='sb')
session.add(obj)
session.add_all([
    Users(name="alex1", extra='sb'),
    Users(name="alex2", extra='sb'),
])
session.commit()
session.query(Users).filter(Users.id > 2).delete()
session.commit()
session.query(Users).filter(Users.id > 2).update({"name" : "099"})
session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False)
session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")
session.commit()
ret = session.query(Users).all()
ret = session.query(Users.name, Users.extra).all()
ret = session.query(Users).filter_by(name='alex').all()
ret = session.query(Users).filter_by(name='alex').first()
# 条件
ret = session.query(Users).filter_by(name='alex').all()
ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
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='eric'))).all()
from sqlalchemy import and_, or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
ret = session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == 'eric', Users.id > 3),
        Users.extra != ""
    )).all()


# 通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()

# 限制
ret = session.query(Users)[1:2]

# 排序
ret = session.query(Users).order_by(Users.name.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()

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()

# 连表

ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()

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()
其他

更多功能参见文档,猛击这里下载PDF

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11月前
|
SQL 关系型数据库 数据库连接
python库之—psycopg2
python库之—psycopg2
|
4月前
|
SQL 关系型数据库 MySQL
django(五)连接mysql
我正在参加「掘金·启航计划」 Django 默认支持的数据库是sqlite,但是正常我们使用的是mysql,因此我们需要修改一下他的默认配置。 首先,放一下我们的项目根目录结构:
59 0
|
8月前
|
数据库
pymysql的使用
pymysql的使用
|
SQL 关系型数据库 MySQL
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')
549 0
|
SQL 关系型数据库 MySQL
Python-PyMysql详解
1.简介 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库 PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。 如果还未安装,我们可以使用以下命令安装最新版的 PyMySQL:
216 0
|
关系型数据库 MySQL 数据库连接
django数据库报错汇总:django.db.utils.OperationalError 1045,1049,2003
django数据库报错汇总:django.db.utils.OperationalError 1045,1049,2003
772 0
|
关系型数据库 MySQL Python
peewee: OperationalError: (2006, ‘MySQL server has gone away’)
peewee: OperationalError: (2006, ‘MySQL server has gone away’)
248 0
PyMySQL模块安装指南
PyMySQL模块安装指南
347 0
PyMySQL模块安装指南
|
SQL Oracle 关系型数据库
FastAPI如何优雅的连接数据库?
FastAPI如何优雅的连接数据库?
2168 0
FastAPI如何优雅的连接数据库?
|
数据库
封装pymysql
封装pymysql