sqlalchemy 使用mysql_使用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>
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数据库并进行操作相关推荐
- python数据库连接mysql_使用Python连接MySQL数据库
本篇文章使用python中的pymysql库连接MySQL数据库,并完成建表,数据写入和查询的过程.为了保证内容的完整性,我们将内容分为两个 阶段,***阶段简单介绍数据的爬取过程.看过之前爬虫文章的 ...
- cas mysql_使用CAS连接Mysql数据库
CAS安装好默认使用的是静态用户和密码,但实际使用中,我们可能连接LDAP.数据库等其他情况.接下来,我们看一下如何使用CAS连接Mysql数据库. 创建数据库1 2 3 4 5 6 7 8DROP ...
- 使用jdbc驱动连接mysql_使用jdbc连接mysql数据库
1.提供mysql的jdbc驱动(我的博客文件里提供了驱动jar包) 2.使用IDEA工具,把jar包添加到项目里(具体步骤如下) 1)打开模块设置 2)选择libraries功能,点击+号,选择ja ...
- Python3学习(三十):python连接mysql数据库及相关操作
Python3 MySQL 数据库连接 本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL 是在 Python3.x ...
- spring无法连接mysql_初学Spring——连接MySQL数据库的问题和解决
零:前言 初学Spring + Angular才不到一周时间,刚打开第一个Spring的示例项目,在运行时就出现了错误. 代码如下: *************************** APPLI ...
- cpp mysql_使用MYSQLCPPCONN连接MYSQL数据库与读写BLOB字段
起初也是用C语言接口, 但不知为什么在VS2010下使用时调用mysql_thread_init()函数总是失败(动态链接) 其他函数也用不了, 用了一阵子的ODBC但不会操作BLOB字段 遂转到MY ...
- spring下连接mysql_使用Spring连接mysql数据库
本例是使用spring定义数据源Bean,使用c3p0数据源实现连接 spring bean 文件 my_connection.xml xmlns="http://www.springfra ...
- hibernate连接mysql数据库步骤_Hibernate (操作步骤)
在java工程里导入Hibernate架包: 在添加数据库架包如: Hibernate开发步骤: 1.Eclipse下创建Hibernate配置文件(需要tools插件) new---->oth ...
- vfp 连接mysql数据库_Visual FoxPro操作数据库之函数大全
ADATABASES() 将所有打开数据库的名称和路径放到内存变量数组中 ADBOBJECTS() 把当前数据库中的命名连接名.关系名.表名或sQL视图名放到一个内存变量数组中 AFIELDS() 把 ...
最新文章
- oracle rman 架构图,图解Oracle RMAN备份入门
- 使用QSerialport读取串口数据并处理
- 修改mysql字符集 为utf8_修改mysql数据库字符集为UTF8的
- overridePendingTransition的简介
- dylib java_将dylib库嵌入macOS应用的方法
- 2017/National _Java_C/2/数字划分
- Android 性能优化——之图片的优化
- 路由器在多个OSPF进程下的路由学习问题
- python解析网页所有可点击_Python 解析网页
- 血淋淋的教训—将Vue项目打包成app的跨域问题
- js自定义对象 (转)
- 网络基础知识(面试基础)
- 计算机功能性英语作文,2017考研英语作文:10个功能性“仿写”句型
- 学习笔记: PCIe 4.0 协议(一)-- 概述
- 织梦dedecms怎么让图片自适应屏幕大小
- ps 学习总结-卸载不了
- 2 电感耦合方式的射频前端
- ECCV 2020 五项大奖出炉!普林斯顿邓嘉获最佳论文奖
- UnityShader源码2017---学习笔记与自我拓展001
- SpringBoot的幕后推手是谁?