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

“导语:这期主要学一下利用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))#结果:
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数据库并进行操作)