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

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

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_使用SQLALchemy连接MySql数据库并进行操作相关推荐

  1. python数据库连接mysql_使用Python连接MySQL数据库

    本篇文章使用python中的pymysql库连接MySQL数据库,并完成建表,数据写入和查询的过程.为了保证内容的完整性,我们将内容分为两个 阶段,***阶段简单介绍数据的爬取过程.看过之前爬虫文章的 ...

  2. cas mysql_使用CAS连接Mysql数据库

    CAS安装好默认使用的是静态用户和密码,但实际使用中,我们可能连接LDAP.数据库等其他情况.接下来,我们看一下如何使用CAS连接Mysql数据库. 创建数据库1 2 3 4 5 6 7 8DROP ...

  3. 使用jdbc驱动连接mysql_使用jdbc连接mysql数据库

    1.提供mysql的jdbc驱动(我的博客文件里提供了驱动jar包) 2.使用IDEA工具,把jar包添加到项目里(具体步骤如下) 1)打开模块设置 2)选择libraries功能,点击+号,选择ja ...

  4. Python3学习(三十):python连接mysql数据库及相关操作

    Python3 MySQL 数据库连接 本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL 是在 Python3.x ...

  5. spring无法连接mysql_初学Spring——连接MySQL数据库的问题和解决

    零:前言 初学Spring + Angular才不到一周时间,刚打开第一个Spring的示例项目,在运行时就出现了错误. 代码如下: *************************** APPLI ...

  6. cpp mysql_使用MYSQLCPPCONN连接MYSQL数据库与读写BLOB字段

    起初也是用C语言接口, 但不知为什么在VS2010下使用时调用mysql_thread_init()函数总是失败(动态链接) 其他函数也用不了, 用了一阵子的ODBC但不会操作BLOB字段 遂转到MY ...

  7. spring下连接mysql_使用Spring连接mysql数据库

    本例是使用spring定义数据源Bean,使用c3p0数据源实现连接 spring bean 文件 my_connection.xml xmlns="http://www.springfra ...

  8. hibernate连接mysql数据库步骤_Hibernate (操作步骤)

    在java工程里导入Hibernate架包: 在添加数据库架包如: Hibernate开发步骤: 1.Eclipse下创建Hibernate配置文件(需要tools插件) new---->oth ...

  9. vfp 连接mysql数据库_Visual FoxPro操作数据库之函数大全

    ADATABASES() 将所有打开数据库的名称和路径放到内存变量数组中 ADBOBJECTS() 把当前数据库中的命名连接名.关系名.表名或sQL视图名放到一个内存变量数组中 AFIELDS() 把 ...

最新文章

  1. oracle rman 架构图,图解Oracle RMAN备份入门
  2. 使用QSerialport读取串口数据并处理
  3. 修改mysql字符集 为utf8_修改mysql数据库字符集为UTF8的
  4. overridePendingTransition的简介
  5. dylib java_将dylib库嵌入macOS应用的方法
  6. 2017/National _Java_C/2/数字划分
  7. Android 性能优化——之图片的优化
  8. 路由器在多个OSPF进程下的路由学习问题
  9. python解析网页所有可点击_Python 解析网页
  10. 血淋淋的教训—将Vue项目打包成app的跨域问题
  11. js自定义对象 (转)
  12. 网络基础知识(面试基础)
  13. 计算机功能性英语作文,2017考研英语作文:10个功能性“仿写”句型
  14. 学习笔记: PCIe 4.0 协议(一)-- 概述
  15. 织梦dedecms怎么让图片自适应屏幕大小
  16. ps 学习总结-卸载不了
  17. 2 电感耦合方式的射频前端
  18. ECCV 2020 五项大奖出炉!普林斯顿邓嘉获最佳论文奖
  19. UnityShader源码2017---学习笔记与自我拓展001
  20. SpringBoot的幕后推手是谁?

热门文章

  1. javascript中变量没有块级作用域---函数内申明的变量在整个函数中都有效!
  2. Linux主机WordPress伪静态设置方法
  3. 邮件被暴力破解邮件网关如何解决
  4. cronolog apache 日志分割
  5. Android GPS Location with Listener
  6. FreeMarker调用JAVA静态方法
  7. 编写配置文件不能出现帮助信息
  8. python3 logging 句柄释放 shutdown 简介
  9. bo a1 蓝牙音箱 中文说明
  10. golang 获取公网ip 内网ip 检测ip类型 校验ip区间 ip地址string和int转换 判断ip地区国家运营商