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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容