zoukankan      html  css  js  c++  java
  • mysql数据库----python操作mysql ------pymysql和SQLAchemy

    本篇对于Python操作MySQL主要使用两种方式:

    • 原生模块 pymsql
    • ORM框架 SQLAchemy

    一、pymysql                                                                                       

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

    下载安装

    pip3 install pymysql

    使用操作

    1、执行SQL

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import pymysql
     4   
     5 # 创建连接
     6 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
     7 # 创建游标
     8 cursor = conn.cursor()
     9   
    10 # 执行SQL,并返回收影响行数
    11 effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
    12   
    13 # 执行SQL,并返回受影响行数
    14 #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
    15   
    16 # 执行SQL,并返回受影响行数
    17 #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
    18   
    19   
    20 # 提交,不然无法保存新建或者修改的数据
    21 conn.commit()
    22   
    23 # 关闭游标
    24 cursor.close()
    25 # 关闭连接
    26 conn.close()
    View Code

    2、获取新创建数据自增ID

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import pymysql
     4   
     5 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
     6 cursor = conn.cursor()
     7 cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
     8 conn.commit()
     9 cursor.close()
    10 conn.close()
    11   
    12 # 获取最新自增ID
    13 new_id = cursor.lastrowid
    View Code

    3、获取查询数据

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import pymysql
     4   
     5 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
     6 cursor = conn.cursor()
     7 cursor.execute("select * from hosts")
     8   
     9 # 获取第一行数据
    10 row_1 = cursor.fetchone()
    11   
    12 # 获取前n行数据
    13 # row_2 = cursor.fetchmany(3)
    14 # 获取所有数据
    15 # row_3 = cursor.fetchall()
    16   
    17 conn.commit()
    18 cursor.close()
    19 conn.close()
    View Code

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

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

    4、fetch数据类型

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

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import pymysql
     4   
     5 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
     6   
     7 # 游标设置为字典类型
     8 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
     9 r = cursor.execute("call p1()")
    10   
    11 result = cursor.fetchone()
    12   
    13 conn.commit()
    14 cursor.close()
    15 conn.close()
    View Code
     1     作业:
     2         参考表结构:
     3             用户类型
     4 
     5             用户信息
     6 
     7             权限
     8 
     9             用户类型&权限
    10         功能:
    11 
    12             # 登陆、注册、找回密码
    13             # 用户管理
    14             # 用户类型
    15             # 权限管理
    16             # 分配权限
    17 
    18         特别的:程序仅一个可执行文件
    练习题

    注意:   (python代码操作数据库)

     1 import pymysql
     2 
     3 user = input("username:")
     4 pwd = input("password:")
     5 
     6 conn = pymysql.connect(host="localhost",user='root',password='',database="db666")
     7 cursor = conn.cursor()
     8 sql = "select * from userinfo where username='%s' and password='%s'" %(user,pwd)    #这段代码提到了注入问题,直接拼接会被他人任意登入,风险很大,所以不能这样写!
     9 # select * from userinfo where username='uu' or 1=1 -- ' and password='%s'    #这里就是利用了注入问题登入了数据库
    10 cursor.execute(sql)
    11 result = cursor.fetchone()
    12 cursor.close()
    13 conn.close()
    14 
    15 if result:
    16     print('登录成功')
    17 else:
    18     print('登录失败')
    sql注入问题(这种写法错误)
     1 import pymysql
     2 
     3 user = input("username:")
     4 pwd = input("password:")
     5 
     6 conn = pymysql.connect(host="localhost",user='root',password='',database="db666")
     7 cursor = conn.cursor()
     8 sql = "select * from userinfo where username=%s and password=%s"
     9 cursor.execute(sql,user,pwd)
    10 # cursor.execute(sql,[user,pwd])
    11 # cursor.execute(sql,{'u':user,'p':pwd})
    12 result = cursor.fetchone()
    13 cursor.close()
    14 conn.close()
    15 if result:
    16     print('登录成功')
    17 else:
    18     print('登录失败')
    正确的写法

    二、SQLAchemy                                                                                 

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

    安装:

    pip3 install SQLAlchemy

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

     1 MySQL-Python
     2     mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
     3    
     4 pymysql
     5     mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
     6    
     7 MySQL-Connector
     8     mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
     9    
    10 cx_Oracle
    11     oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
    12    
    13 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html

    一、内部处理

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

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 from sqlalchemy import create_engine
     4   
     5   
     6 engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
     7   
     8 # 执行SQL
     9 # cur = engine.execute(
    10 #     "INSERT INTO hosts (host, color_id) VALUES ('1.1.1.22', 3)"
    11 # )
    12   
    13 # 新插入行自增ID
    14 # cur.lastrowid
    15   
    16 # 执行SQL
    17 # cur = engine.execute(
    18 #     "INSERT INTO hosts (host, color_id) VALUES(%s, %s)",[('1.1.1.22', 3),('1.1.1.221', 3),]
    19 # )
    20   
    21   
    22 # 执行SQL
    23 # cur = engine.execute(
    24 #     "INSERT INTO hosts (host, color_id) VALUES (%(host)s, %(color_id)s)",
    25 #     host='1.1.1.99', color_id=3
    26 # )
    27   
    28 # 执行SQL
    29 # cur = engine.execute('select * from hosts')
    30 # 获取第一行数据
    31 # cur.fetchone()
    32 # 获取第n行数据
    33 # cur.fetchmany(3)
    34 # 获取所有数据
    35 # cur.fetchall()
    View Code

    二、ORM功能使用

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

    1、创建表

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 from sqlalchemy.ext.declarative import declarative_base
     4 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
     5 from sqlalchemy.orm import sessionmaker, relationship
     6 from sqlalchemy import create_engine
     7  
     8 engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
     9  
    10 Base = declarative_base()
    11  
    12 # 创建单表
    13 class Users(Base):
    14     __tablename__ = 'users'
    15     id = Column(Integer, primary_key=True)
    16     name = Column(String(32))
    17     extra = Column(String(16))
    18  
    19     __table_args__ = (
    20     UniqueConstraint('id', 'name', name='uix_id_name'),
    21         Index('ix_id_name', 'name', 'extra'),
    22     )
    23  
    24  
    25 # 一对多
    26 class Favor(Base):
    27     __tablename__ = 'favor'
    28     nid = Column(Integer, primary_key=True)
    29     caption = Column(String(50), default='red', unique=True)
    30  
    31  
    32 class Person(Base):
    33     __tablename__ = 'person'
    34     nid = Column(Integer, primary_key=True)
    35     name = Column(String(32), index=True, nullable=True)
    36     favor_id = Column(Integer, ForeignKey("favor.nid"))
    37  
    38  
    39 # 多对多
    40 class Group(Base):
    41     __tablename__ = 'group'
    42     id = Column(Integer, primary_key=True)
    43     name = Column(String(64), unique=True, nullable=False)
    44     port = Column(Integer, default=22)
    45  
    46  
    47 class Server(Base):
    48     __tablename__ = 'server'
    49  
    50     id = Column(Integer, primary_key=True, autoincrement=True)
    51     hostname = Column(String(64), unique=True, nullable=False)
    52  
    53  
    54 class ServerToGroup(Base):
    55     __tablename__ = 'servertogroup'
    56     nid = Column(Integer, primary_key=True, autoincrement=True)
    57     server_id = Column(Integer, ForeignKey('server.id'))
    58     group_id = Column(Integer, ForeignKey('group.id'))
    59  
    60  
    61 def init_db():
    62     Base.metadata.create_all(engine)
    63  
    64  
    65 def drop_db():
    66     Base.metadata.drop_all(engine)
    View Code

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

    2、操作表

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 from sqlalchemy.ext.declarative import declarative_base
     4 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
     5 from sqlalchemy.orm import sessionmaker, relationship
     6 from sqlalchemy import create_engine
     7 
     8 engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
     9 
    10 Base = declarative_base()
    11 
    12 # 创建单表
    13 class Users(Base):
    14     __tablename__ = 'users'
    15     id = Column(Integer, primary_key=True)
    16     name = Column(String(32))
    17     extra = Column(String(16))
    18 
    19     __table_args__ = (
    20     UniqueConstraint('id', 'name', name='uix_id_name'),
    21         Index('ix_id_name', 'name', 'extra'),
    22     )
    23 
    24     def __repr__(self):
    25         return "%s-%s" %(self.id, self.name)
    26 
    27 # 一对多
    28 class Favor(Base):
    29     __tablename__ = 'favor'
    30     nid = Column(Integer, primary_key=True)
    31     caption = Column(String(50), default='red', unique=True)
    32 
    33     def __repr__(self):
    34         return "%s-%s" %(self.nid, self.caption)
    35 
    36 class Person(Base):
    37     __tablename__ = 'person'
    38     nid = Column(Integer, primary_key=True)
    39     name = Column(String(32), index=True, nullable=True)
    40     favor_id = Column(Integer, ForeignKey("favor.nid"))
    41     # 与生成表结构无关,仅用于查询方便
    42     favor = relationship("Favor", backref='pers')
    43 
    44 # 多对多
    45 class ServerToGroup(Base):
    46     __tablename__ = 'servertogroup'
    47     nid = Column(Integer, primary_key=True, autoincrement=True)
    48     server_id = Column(Integer, ForeignKey('server.id'))
    49     group_id = Column(Integer, ForeignKey('group.id'))
    50     group = relationship("Group", backref='s2g')
    51     server = relationship("Server", backref='s2g')
    52 
    53 class Group(Base):
    54     __tablename__ = 'group'
    55     id = Column(Integer, primary_key=True)
    56     name = Column(String(64), unique=True, nullable=False)
    57     port = Column(Integer, default=22)
    58     # group = relationship('Group',secondary=ServerToGroup,backref='host_list')
    59 
    60 
    61 class Server(Base):
    62     __tablename__ = 'server'
    63 
    64     id = Column(Integer, primary_key=True, autoincrement=True)
    65     hostname = Column(String(64), unique=True, nullable=False)
    66 
    67 
    68 
    69 
    70 def init_db():
    71     Base.metadata.create_all(engine)
    72 
    73 
    74 def drop_db():
    75     Base.metadata.drop_all(engine)
    76 
    77 
    78 Session = sessionmaker(bind=engine)
    79 session = Session()
    80 
    81 表结构 + 数据库连接
    表结构+数据库

    1 obj = Users(name="alex0", extra='sb')
    2 session.add(obj)
    3 session.add_all([
    4     Users(name="alex1", extra='sb'),
    5     Users(name="alex2", extra='sb'),
    6 ])
    7 session.commit()
    View Code

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

    其他

     1 # 条件
     2 ret = session.query(Users).filter_by(name='alex').all()
     3 ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
     4 ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
     5 ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
     6 ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
     7 ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
     8 from sqlalchemy import and_, or_
     9 ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
    10 ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
    11 ret = session.query(Users).filter(
    12     or_(
    13         Users.id < 2,
    14         and_(Users.name == 'eric', Users.id > 3),
    15         Users.extra != ""
    16     )).all()
    17 
    18 
    19 # 通配符
    20 ret = session.query(Users).filter(Users.name.like('e%')).all()
    21 ret = session.query(Users).filter(~Users.name.like('e%')).all()
    22 
    23 # 限制
    24 ret = session.query(Users)[1:2]
    25 
    26 # 排序
    27 ret = session.query(Users).order_by(Users.name.desc()).all()
    28 ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
    29 
    30 # 分组
    31 from sqlalchemy.sql import func
    32 
    33 ret = session.query(Users).group_by(Users.extra).all()
    34 ret = session.query(
    35     func.max(Users.id),
    36     func.sum(Users.id),
    37     func.min(Users.id)).group_by(Users.name).all()
    38 
    39 ret = session.query(
    40     func.max(Users.id),
    41     func.sum(Users.id),
    42     func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()
    43 
    44 # 连表
    45 
    46 ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
    47 
    48 ret = session.query(Person).join(Favor).all()
    49 
    50 ret = session.query(Person).join(Favor, isouter=True).all()
    51 
    52 
    53 # 组合
    54 q1 = session.query(Users.name).filter(Users.id > 2)
    55 q2 = session.query(Favor.caption).filter(Favor.nid < 2)
    56 ret = q1.union(q2).all()
    57 
    58 q1 = session.query(Users.name).filter(Users.id > 2)
    59 q2 = session.query(Favor.caption).filter(Favor.nid < 2)
    60 ret = q1.union_all(q2).all()
    View Code

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

     。◕‿◕。笔记详细整理:ORM框架创建表和操作表

      1 #!/usr/bin/env python
      2 # -*- coding:utf-8 -*-
      3 
      4 ########################### 对象关系映射(英语:(Object Relational Mapping,简称ORM #################################
      5 
      6 from sqlalchemy.ext.declarative import declarative_base
      7 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index,CHAR,VARCHAR
      8 from sqlalchemy.orm import sessionmaker, relationship
      9 from sqlalchemy import create_engine
     10 
     11 Base = declarative_base()
     12 
     13 engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day63?charset=utf8", max_overflow=5)
     14 
     15 # 创建单表  (如下创建了两个类,也就是两个表;类下面的内容就是表里的列)
     16 class UserType(Base):
     17     __tablename__ = 'usertype'         #这一行是表名
     18     id = Column(Integer, primary_key=True, autoincrement=True)            #Colunm  列
     19     title = Column(VARCHAR(32), nullable=True, index=True)
     20 
     21 class Users(Base):
     22     __tablename__ = 'users'            #这一行是表名
     23     id = Column(Integer, primary_key=True, autoincrement=True)
     24     name = Column(VARCHAR(32), nullable=True, index=True)
     25     email = Column(VARCHAR(16), unique=True)
     26     user_type_id = Column(Integer,ForeignKey("usertype.id"))
     27 
     28 
     29 #  联合唯一索引
     30     # __table_args__ = (
     31     #     UniqueConstraint('id', 'name', name='uix_id_name'),
     32     #     Index('ix_n_ex','name', 'email',),
     33     # )
     34 
     35 
     36 def create_db():
     37     Base.metadata.create_all(engine)              #创建表
     38 
     39 def drop_db():
     40     Base.metadata.drop_all(engine)                #删除表
     41 
     42 # create_db()                 #调用创建表函数
     43 # drop_db()                   #调用删除表函数
     44 
     45 
     46 Session = sessionmaker(bind=engine)
     47 session = Session()
     48 
     49 
     50 # 类 -> 代指的就是表
     51 # 对象 -> 代指的就是行
     52 
     53 
     54 # ###### 增 ######
     55 # obj1 = UserType(title='普通用户')             #向UserType表中插入1条数据
     56 # session.add(obj1)
     57 #
     58 # objs =[                                      #向UserType表中插入多条数据
     59 #   UserType(title='超级用户'),
     60 #   UserType(title='白金用户'),
     61 #   UserType(title='黑金用户'),
     62 # ]
     63 # session.add_all(objs)
     64 
     65 # obj2 = Users(name='青铜')                   #向Users表中插入1条数据
     66 # session.add(obj2)
     67 #
     68 # objs2 = [                                    #向Users表中插入多条数据
     69 #     Users(name='白银'),
     70 #     Users(name='黄金'),
     71 #     Users(name='铂金'),
     72 #     Users(name='钻石'),
     73 #     Users(name='大师'),
     74 #     Users(name='王者'),
     75 # ]
     76 # session.add_all(objs2)
     77 
     78 
     79 # ###### 查 ######
     80 # print(session.query(UserType))               #查看表UserType,这里打印出来的是SQL语句
     81 # user_type_list = session.query(UserType).all()       #查看表UserType所有内容
     82 # for row in user_type_list:               #遍历表UserType所有内容
     83 #     print(row.id,row.title)               #打印遍历结果中的id和title
     84 
     85 
     86 # #过滤查询,相当于where,设定查询条件,filter(过滤),这里意思是查询UserType里面的id和title,并且过滤条件为id>2的
     87 # user_type_list = session.query(UserType.id,UserType.title).filter(UserType.id > 2)
     88 # for row in user_type_list:
     89 #     print(row.id,row.title)
     90 
     91 
     92 # ###### 删除 ######
     93 # session.query(UserType.id,UserType.title).filter(UserType.id > 2).delete()
     94 
     95 
     96 # ###### 修改 ######
     97 #**********批量修改----这里批量修改title为黑金
     98 # session.query(UserType.id,UserType.title).filter(UserType.id > 0).update({"title" : "黑金"})
     99 
    100 #**********批量字符串类型修改----这里是批量在原title基础上+'aaa',加上的内容是字符串类型,修改对象也应是字符串类型
    101 # session.query(UserType.id,UserType.title).filter(UserType.id > 0).update({UserType.title: UserType.title + "aaa"}, synchronize_session=False)
    102 
    103 #**********批量数字类型修改----这里是批量在原num基础上+'111',加上的内容是数字类型,修改对象也应是数字类型
    104 # session.query(UserType.id,UserType.title).filter(UserType.id > 0).update({"num": Users.num + 111}, synchronize_session="evaluate")
    105 
    106 
    107 session.commit()           #执行完提交
    108 session.close()           #关闭这次会话
    ORM框架创建表和操作表
  • 相关阅读:
    一个好的时间函数
    Codeforces 785E. Anton and Permutation
    Codeforces 785 D. Anton and School
    Codeforces 510 E. Fox And Dinner
    Codeforces 242 E. XOR on Segment
    Codeforces 629 E. Famil Door and Roads
    Codeforces 600E. Lomsat gelral(Dsu on tree学习)
    Codeforces 438D The Child and Sequence
    Codeforces 729E Subordinates
    【ATcoder】D
  • 原文地址:https://www.cnblogs.com/wangyongsong/p/6978623.html
Copyright © 2011-2022 走看看