sqlalchemy 配置mysql_使用SQLALchemy连接MySql数据库并进行操作

本文介绍了如何使用Python的ORM库SQLAlchemy连接MySQL数据库并进行增删改查操作。通过示例代码详细展示了创建表、定义模型、建立数据库连接、数据操作的全过程,包括模糊查询、批量操作等常见操作,并针对可能出现的错误提供了解决方案。
摘要由CSDN通过智能技术生成

“导语:这期主要学一下利用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建立的」:

aaadf6e7d688

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>

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中展示如下图所示

aaadf6e7d688

image

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

aaadf6e7d688

image

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),如下图。

aaadf6e7d688

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数据库连接起来并进行基本的增删查改操作,下次学习一下如何将数据库与客户端进行交互吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值