视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL—pymysqlandSQLAlchemy
2020-11-09 08:55:06 责编:小采
文档


目录

一、pymysql

二、SQLAlchemy

一、pymysql

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

1. 下载安装

#在终端直接运行
pip3 install pymysql

2. 使用操作

a. 执行SQL

#!/usr/bin/env python# -*- coding:utf-8 -*-import pymysql
 # 创建连接conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')# 创建游标cursor = conn.cursor()
 # 执行SQL,并返回受影响行数effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
 # 执行SQL,并返回受影响行数#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,)) # 执行SQL,并返回受影响行数#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) 
 # 提交,不然无法保存新建或者修改的数据conn.commit()
 # 关闭游标cursor.close()# 关闭连接conn.close()

b. 获取新创建数据自增ID

#!/usr/bin/env python# -*- coding:utf-8 -*-import pymysql
 
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()# 获取最新自增IDnew_id = cursor.lastrowid

cursor.close()
conn.close()

c. 获取查询数据

#!/usr/bin/env python# -*- coding:utf-8 -*-import pymysql
 
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.execute("select * from hosts")
 # 获取第一行数据row_1 = cursor.fetchone()
 # 获取前n行数据# row_2 = cursor.fetchmany(3)# 获取所有数据# row_3 = cursor.fetchall() 
conn.commit()
cursor.close()
conn.close()

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

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

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

  • d. fetch数据类型

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

    #!/usr/bin/env python# -*- coding:utf-8 -*-import pymysql
     
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
     # 游标设置为字典类型cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    r = cursor.execute("call p1()")
     
    result = cursor.fetchone()
     
    conn.commit()
    cursor.close()
    conn.close()

    二、SQLAlchemy

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

    1. 下载安装

    #在终端直接运行pip3 install SQLAlchemy

    2. SQLAlchemy依赖关系

    SQLAlchemy本身无法操作数据库,其必须依赖pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作。
    MySQL-Python
     mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> 
    pymysql
     mysql+pymysql://<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...]
    更多详见:index.html

    3. ORM功能使用

    使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。a. 创建表
    #!/usr/bin/env python# -*- coding:utf-8 -*-from sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Indexfrom sqlalchemy.orm import sessionmaker, relationshipfrom sqlalchemy import create_engine#表明依赖关系并创建连接,最大连接数为5 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,autoincrement=True) # id列,主键自增 name = Column(String(32)) # name列 extra = Column(String(16)) # extra列 
     __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(), 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(), 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)

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

    b. 操作表
    #!/usr/bin/env python# -*- coding:utf-8 -*-from sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Indexfrom sqlalchemy.orm import sessionmaker, relationshipfrom 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(), 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(), 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()
    表结构 + 数据库连接

    b.1 增

    #单条增加obj = Users(name="alex0", extra='sb')
    session.add(obj)#多条增加session.add_all([
     Users(name="alex1", extra='sb'),
     Users(name="alex2", extra='sb'),
    ])#提交session.commit()

    b.2 删

    #先查询到要删除的记录,再deletesession.query(Users).filter(Users.id > 2).delete()
    session.commit()

    b.3 改

    #先查询,再更新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()

    b.4 查

    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(text("id<:value and name=:name")).params(value=224, name='fred').order_by(User.id).all()
    
    ret = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all()

    b.5 其它

    # 条件ret = session.query(Users).filter_by(name='alex').all() # 条件内为关键字表达式ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all() # 条件内为SQL表达式ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all() # betweenret = session.query(Users).filter(Users.id.in_([1,3,4])).all() # inret = session.query(Users).filter(~Users.id.in_([1,3,4])).all() # not inret = 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() # andret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all() # orret = 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() # e开头ret = session.query(Users).filter(~Users.name.like('e%')).all() # 非e开头# ret = session.query(Users)[1:2] # 相当于limit# 排序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() # 默认内连 inner joinret = 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()

    参考资料:

    1. Python开发【第十九篇】:Python操作MySQL

    下载本文
    显示全文
    专题