文章目录

  • Python连接数据库
    • 连接SQLite
    • 连接MySQL
    • 使用SQLAlchemy

Python连接数据库

本文为jupyter Notebook导出文档,可能显示效果不太好

连接SQLite

要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection;

连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。

Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。

由于SQLite的驱动内置在Python标准库中,可以直接来操作SQLite数据库。

# 导入SQLite驱动:
import sqlite3
# 连接到SQLite数据库
# 数据库文件是test.db
# 如果文件不存在,会自动在当前目录创建:
conn = sqlite3.connect('test.db')
# 创建一个Cursor:
cursor = conn.cursor()
# 执行一条SQL语句,创建user表:
cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
<sqlite3.Cursor at 0x2040e1eff10>
# 继续执行一条SQL语句,插入一条记录:
cursor.execute('insert into user (id, name) values ("1", "vigilr")')
<sqlite3.Cursor at 0x2040e1eff10>
# 通过rowcount获得插入的行数:
cursor.rowcount
1
# 关闭Cursor:
cursor.close()
# 提交事务:
conn.commit()
# 关闭Connection:
conn.close()
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 执行查询语句:
cursor.execute('select * from user where id=?',('1',))
<sqlite3.Cursor at 0x2040e224810>
# 获得查询结果集:
values = cursor.fetchall()
values
[('1', 'vigilr')]
cursor.close()
conn.close()

使用Python的DB-API时,只要搞清楚ConnectionCursor对象,打开后一定记得关闭,就可以放心地使用。

使用Cursor对象执行insertupdatedelete语句时,执行结果由rowcount返回影响的行数,就可以拿到执行结果。

使用Cursor对象执行select语句时,通过featchall()可以拿到结果集。结果集是一个list,每个元素都是一个tuple,对应一行记录。

如果SQL语句带有参数,那么需要把参数按照位置传递给execute()方法,有几个?占位符就必须对应几个参数,例如:

cursor.execute('select * from user where name=? and pwd=?', ('abc', 'password'))
# -*- coding: utf-8 -*-import sqlite3# 初始数据:
conn = sqlite3.connect('test1.db')
cursor = conn.cursor()
cursor.execute('create table user(id varchar(20) primary key, name varchar(20), score int)')
cursor.execute(r"insert into user values ('A-001', 'Adam', 95)")
cursor.execute(r"insert into user values ('A-002', 'Bart', 62)")
cursor.execute(r"insert into user values ('A-003', 'Lisa', 78)")
cursor.close()
conn.commit()
conn.close()
def get_score_in(low, high):'''返回指定分数区间的名字,按分数从低到高排序'''conn = sqlite3.connect('test1.db')cursor = conn.cursor()cursor.execute('select name from user where score>=? and score<=? ORDER BY score',(low,high))temp=cursor.fetchall()result=[]for t in temp:for i in t:result.append(i)cursor.close()conn.close()return result
# 测试:
assert get_score_in(80, 95) == ['Adam'], get_score_in(80, 95)
assert get_score_in(60, 80) == ['Bart', 'Lisa'], get_score_in(60, 80)
assert get_score_in(60, 100) == ['Bart', 'Lisa', 'Adam'], get_score_in(60, 100)print('Pass')
Pass

连接MySQL

安装MySQL驱动

由于MySQL服务器以独立的进程运行,并通过网络对外服务,所以,需要支持Python的MySQL驱动来连接到MySQL服务器。
MySQL官方提供了mysql-connector-python驱动,但是安装的时候需要给pip命令加上参数--allow-external
pip install mysql-connector-python --allow-external mysql-connector-python

如果上面的命令安装失败,可以试试另一个驱动:
pip install mysql-connector

除了使用mysql.connector还可以使用pymysql

# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host="127.0.0.1",port=3308,user="root",password="123456",database="test",charset="utf8")
cursor = conn.cursor()
# 创建user表:
cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
cursor.close()
conn.close()
conn = pymysql.connect(host="127.0.0.1",port=3308,user="root",password="123456",database="test",charset="utf8")
cursor = conn.cursor()
# 插入一行记录,注意MySQL的占位符是%s:
cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'wasd'])
cursor.execute('insert into user (id, name) values (%s, %s)', ['2', 'zxc'])
print('受影响行数:',cursor.rowcount)# 提交事务:
conn.commit()
cursor.close()
conn.close()
受影响行数: 1
# 连接database
conn = pymysql.connect(host="127.0.0.1",port=3308,user="root",password="123456",database="test",charset="utf8")
# 运行查询:
cursor = conn.cursor()
cursor.execute('select * from user')
values = cursor.fetchall()
print(values)
# 关闭Cursor和Connection:
cursor.close()
conn.close()
(('1', 'wasd'), ('2', 'zxc'))

使用SQLAlchemy

ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。

在Python中,最有名的ORM框架是SQLAlchemy。

首先通过pip安装SQLAlchemy:pip install sqlalchemy

# 第一步,导入SQLAlchemy,并初始化DBSession:# 导入:
from sqlalchemy import Column, String, create_engine,ForeignKey
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy.ext.declarative import declarative_base
# 创建对象的基类:
Base = declarative_base()# 定义User对象:
class User(Base):# 表的名字:__tablename__ = 'users'# 表的结构:id = Column(String(20), primary_key=True)name = Column(String(20))# 以上代码完成SQLAlchemy的初始化和具体每个表的class定义。如果有多个表,就继续定义其他class,例如Scho
class School(Base):__tablename__ = 'school'id = Column(String(20), primary_key=True)name = Column(String(20))# 初始化数据库连接:mysqlconnector和pymysql都可以用
# engine = create_engine('mysql+mysqlconnector://root:123456@localhost:3308/test')
engine = create_engine('mysql+pymysql://root:123456@localhost:3308/test')
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)

create_engine()用来初始化数据库连接。SQLAlchemy用一个字符串表示连接信息:
数据库类型+数据库驱动名称://用户名:密码@数据库地址:端口号/数据库名

由于有了ORM,我们向数据库表中添加一行记录,可以视为添加一个User对象:

# 创建所有定义的表到数据库中
Base.metadata.create_all(engine)
# 创建session对象:
session = DBSession()
# 创建新User对象:
user1 = User(id='1', name='wasd')
user2 = User(id='2', name='zxc')
user3 = User(id='3', name='qwe')
user4 = User(id='4', name='rty')
user5 = User(id='5', name='vbn')
user6 = User(id='6', name='fgh')
# 添加到session:
session.add(user1)
session.add(user2)
session.add(user3)
session.add(user4)
session.add(user5)
session.add(user6)
# 提交即保存到数据库:
session.commit()
# 关闭session:
session.close()# 关键是获取session,然后把对象添加到session,最后提交并关闭。DBSession对象可视为当前数据库连接。
E:\Users\Administrator\Anaconda3\lib\site-packages\pymysql\cursors.py:170: Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 489")result = self._query(query)
# 查询数据# 创建Session:
session = DBSession()
# 创建Query查询,filter是where条件,最后调用one()返回唯一行,如果调用all()则返回所有行:
user = session.query(User).filter(User.id=='1').one()
users = session.query(User).filter(User.id!='1').all()
# 打印类型和对象的name属性:
print('type:', type(user))
print('name:', user.name)
for user in users:print('type:', type(user))print('name:', user.name)
# 关闭Session:
session.close()
type: <class '__main__.User'>
name: wasd
type: <class '__main__.User'>
name: zxc
type: <class '__main__.User'>
name: qwe
type: <class '__main__.User'>
name: rty
type: <class '__main__.User'>
name: vbn
type: <class '__main__.User'>
name: fgh

ORM就是把数据库表的行与相应的对象建立关联,互相转换。

由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多、多对多等功能。

例如,如果一个User拥有多个Book,就可以定义一对多关系如下:

class User(Base):__tablename__ = 'user'__table_args__ = {'extend_existing': True}id = Column(String(20), primary_key=True)name = Column(String(20))# 一对多:books = relationship('Book')class Book(Base):__tablename__ = 'book'id = Column(String(20), primary_key=True)name = Column(String(20))# “多”的一方的book表是通过外键关联到user表的:user_id = Column(String(20), ForeignKey('user.id'))# 当我们查询一个User对象时,该对象的books属性将返回一个包含若干个Book对象的list。
# 创建所有定义的表到数据库中
Base.metadata.create_all(engine)
E:\Users\Administrator\Anaconda3\lib\site-packages\sqlalchemy\ext\declarative\clsregistry.py:129: SAWarning: This declarative base already contains a class with the same class name and module name as __main__.User, and will be replaced in the string-lookup table.% (item.__module__, item.__name__)

更多用法可参考:这篇文章https://www.jianshu.com/p/65903a69d61d

【Python】三种连接数据库的方式相关推荐

  1. python三种注释方法

    python三种注释方法 方式1: 单行注释:shift + #(在代码的最前面输入,非选中代码进行注释) 多行注释:同单行一样在每一行的前面输入shift + #(较麻烦了) 方式2: 单行和多行一 ...

  2. Python的三种格式化输出方式

    一.第一种,利用%(称之为:占位符)格式化输出: s = """ ------------- info ------------- name:%s age:%s job: ...

  3. Apache Spark探秘:三种分布式部署方式比较

    2019独角兽企业重金招聘Python工程师标准>>> 目前Apache Spark支持三种分布式部署方式,分别是standalone.spark on mesos和 spark o ...

  4. 了解mysql的三种不同安装方式的区别

    学习目的:了解mysql的三种不同安装方式的区别 学习内容: mysql 的安装有三种:分别是源码安装.二进制安装.rpm安装. 源码安装的优势:linux操作系统开放源代码,因此在其上面安装的软件大 ...

  5. lvs的调度算法有几种_LVS:三种负载均衡方式比较

    1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很 ...

  6. 多角度对比数据中心常见的三种走线方式

    01 三种走线方式的施工图片 ▽下走线(地板下走线) ▽天花吊顶上走线 ▽机柜顶部走线 02 三种走线方式对比 通过上面的比较,毫无疑问,机柜顶部走线模式是最有优势的,给用户带来很多好处,包括维护方便 ...

  7. asp.net session 介绍一三种Session存储方式

    asp.net session 介绍一三种Session存储方式 www.firnow.com 时间:2009-03-04 作者:匿名 编辑:sky 点击: 1478 [评论] 对于asp.net的程 ...

  8. spark on yarn 完全分布式_Apache Spark探秘:三种分布式部署方式比较

    [本文详细介绍了Spark的三种部署方式及其比较,欢迎读者朋友们阅读.转发和收藏!] 目前Apache Spark支持三种分布式部署方式,分别是 standalone . spark on mesos ...

  9. LVS:三种负载均衡方式比较+另三种负载均衡方式

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

最新文章

  1. CNN卷积神经网络可视化:可交互有细节,卷积ReLU池化都一目了然
  2. win10每次开机都会自检系统盘(非硬件故障)——解决方案2019.07.12
  3. 常用软件架构模式分类
  4. 帧布局 (FrameLayout)
  5. 在python IDLE里执行py文件
  6. Vue中的 computed 和 watch的区别
  7. 百度时间显示_文章的发布时间对百度优化网站重要吗
  8. Nodejs留言板案例总结
  9. SQL server 2005的复制(四)
  10. 怎么使用Vegas制作炫彩灯光效果?
  11. r2游戏服务器网站,神秘揭晓《R2》公测服务器名称首度公布
  12. 爬取京东收件地址下得所有数据
  13. 计算机毕业设计Java传统文化知识竞赛系统(源码+系统+mysql数据库+lw文档
  14. “求同”不是最终目标,英特尔致力打造有“差异”的精彩
  15. 记录第一次完整安卓逆向过程笔记
  16. 家用计算机如何关机,win7如何快速关机_win7快速关机的方法
  17. 自动化立体库能力分析——堆垛机(单深单货位Case1,双循环)
  18. ImageLoader 详解
  19. UCML应用框架平台的特点
  20. 有参考图像的图像质量评估方法及代码(PSNR,SSIM,RMSE,NRMSE,ENTROPY)

热门文章

  1. IDEA完整安装教程
  2. uniapp的video组件视频预览略缩图问题
  3. linux源码编译ant,linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件...
  4. 001:数据分析概述
  5. 查询各科分数最高的科目名称,学生学号,姓名,分数,排名
  6. P1618 三连击(升级版)| JAVA题解
  7. 台式计算机dvd光驱在哪里,台式电脑怎么弹出光驱_台式电脑怎么弹出dvd
  8. 【WinRAR】WinRAR 6.02 官方最新简体中文版
  9. UE5 Shader基础学习笔记——13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power
  10. 一个有趣的SQL问题。