“导语:这期主要学一下利用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),如下图。
#批量删除记录
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数据库连接起来并进行基本的增删查改操作,下次学习一下如何将数据库与客户端进行交互吧~
网友评论