美文网首页
使用SQLALchemy连接MySql数据库并进行操作

使用SQLALchemy连接MySql数据库并进行操作

作者: Minka__ | 来源:发表于2019-04-07 20:25 被阅读0次

    “导语:这期主要学一下利用SQLALchemy连接MySql数据库以及对数据库的增删改查的操作,可能代码部分很多还不能理解,我觉得像一些固定写法先用着(比如引入的类等),再慢慢体会缘由”

    01

    连接数据库并进行操作

    [ORM概念]

    是Object-Relational Mapping即对象关系映射,就是将关系型数据库和对象之间做一个映射,这样就可以不用使用SQL语句,直接用python语句就可以处理数据库了,其中,python中最成熟的ORM库就是SQLALchemy

    使用SQLALchemy进行数据库操作,需要三步,定义表(对应着数据库的表),与数据库进行连接,对数据库进行操作。

    [代码]

    # -*- coding:utf-8 -*-
    #---------------定义表需要的类-----------------
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String
    #--------------连接数据库需要的类---------------
    from sqlalchemy import create_engine#建立数据库引擎
    from sqlalchemy.orm import sessionmaker#建立会话session
    ​
    #---------第一部分:定义表-----------
    ​
    Base=declarative_base()#实例,创建基类
    #所有的表必须继承于Base
    class Enhancer(Base):
        __tablename__='enhancer'#定义该表在mysql数据库中的实际名称
    #定义表的内容
        id=Column(Integer,primary_key=True)
        chr=Column(String(5),nullable=False)
        start=Column(Integer,nullable=False)
        end=Column(Integer,nullable=False)
    ​
    #---------第二部分:与数据库连接--------
    ​
    db_connect_string='mysql+pymysql://root:0000@localhost:3306/zy?charset=utf8'
    #以mysql数据库为例:mysql+数据库驱动://用户名:密码@localhost:3306/数据库
    engine=create_engine(db_connect_string)#创建引擎
    Sesssion=sessionmaker(bind=engine)#产生会话
    ​
    session=Sesssion() #创建Session实例
    ​
    #----------第三部分:进行数据操作--------
    ​
    #提交新数据
    session.add(Enhancer(chr="例子",start=200,end=400))#只能加一条数据
    session.add_all([Enhancer(chr="例子12",start=200,end=400),Enhancer(chr="例子12",start=200,end=400)])
    # 使用add_all可以一次传入多条数据,以列表的形式。
    session.commit()#提交数据
    

    上面代码进行了连接mysql数据库以及增加数据,下面是对数据库数据的其他操作。

    查询「这里查询到的数据是提前通过mysql建立的」:

    image

    过滤查询:(只举一个模糊查询like()的例子,还有等于==,不等于!=,包含in_()等)

    #模糊查询like()
    rs = session.query(Enhancer).filter(Enhancer.chr.like('c%')).all()
    #通配符%, %c代表以c结尾,c%代表以c开头,%c%代表包含c
    for i in rs:
      print(i.id)
    

    删除:

    #删除记录
    session.query(Enhancer).filter(Enhancer.chr=="chr2").delete()
    session.commit()
    

    更新:

    #第一种更新记录方法
    rs=session.query(Enhancer).filter(Enhancer.chr.like('%1')).first()
    print(rs)# 结果:<__main__.Enhancer object at 0x7fd7117d9a50>
    print(type(rs))#结果:<class '__main__.Enhancer'>
    rs.start=10001
    #第二种更新记录方法
    session.query(Enhancer).filter(Enhancer.chr.like('%1')).update({'end':'2000001'},synchronize_session=False)
    session.commit()
    

    通过主键和外键将多张表联系起来

    #定义两个表
    class Class(Base):
        __tablename__='class'
        id=Column(Integer,primary_key=True)
        name=Column(String(50))
        level=Column(Integer)
        address=Column(String(50))
      #这里需要注意,并不是有一个studens列~,这里的students可以理解为
      #关联的下一个表中满足条件的所有内容
        students = relationship("Student",backref="class")
    ​
    class Student(Base):
        __tablename__="student"
        student_id = Column(Integer,primary_key=True)
        name=Column(String(50))
        age = Column(Integer)
        class_id = Column(Integer,ForeignKey('class.id'))
    

    然后加入一些数据,在mysql中展示如下图所示

    image

    可以发现通过class中的主键id和student中外键class_id将两个表连接起来 。主键是唯一且非空的列,可以看出class中id等于1时对应着多个students。下面是跨越两张表的查询:

    image

    参考:sqlalchemy说明文档http://zetcode.com/db/sqlalchemy/orm/

    02

    Bug出没

    • 连接数据库时需要数据库驱动,这里用的pymysql,之前尝试了另一个驱动mysqldb,发现mysqldb不支持python3,而在python2中不能用pip安装。

    • 在使用sqlalchemy连接数据库之前,必须先在MySql中建立该数据库以及该表,否则报错。

    • 使用删除delete()或者更新update()时用到批量操作,例如in_,或者like,会进行报错

      解决方法:
      1。在delete()或者update()中加入参数:synchronize_session=False,意思是不对session进行同步,直接更新数据库。
      2。 对特定结果进行for遍历,然后对每一条结果i进行session.delete(i),如下图。

    image
    #批量删除记录
    rs=session.query(Enhancer).filter(Enhancer.chr.like('%2'))
    for i in rs:
        session.delete(i)
    session.commit()
    
    • 报错:“AttributeError: 'tuple' object has no attribute 'foreign_keys'”
      解决方法:这个错误是因为backref的写法错误导致,应该是backref="~~",写成backref()就错了。

    「END」

    这期已经和MySql数据库连接起来并进行基本的增删查改操作,下次学习一下如何将数据库与客户端进行交互吧~

    相关文章

      网友评论

          本文标题:使用SQLALchemy连接MySql数据库并进行操作

          本文链接:https://www.haomeiwen.com/subject/sqkeiqtx.html