SQLite作为一种应用广泛的文件式关系型数据库,python操作sqlite主要有两种方式,原生SQL语句和ORM映射工具。

SQLAlchemy连接SQLITE

SQLAlchemy是一款优秀的python连接关系型数据库的ORM工具,支持SQLite,MYSQL,ORICLE等多种关系型数据库,具体使用:

参见:http://docs.jinkan.org/docs/flask/patterns/sqlalchemy.html

这里主要记录一下SQLAlchemy连接SQLITE的配置方法:

from sqlalchemy import create_engine

# 在Unix/Mac
engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True) # /tmp/test.db为数据库文件的绝对路径
engine = create_engine('sqlite:///tmp/test.db', convert_unicode=True) # tmp/test.db为数据库文件的相对路径 # 在Windows
engine = create_engine('sqlite:///C:\\path\\to\\foo.db') # C:\\path\\to\\foo.db为绝对路径,需要转义
engine = create_engine(r'sqlite:///C:\path\to\foo.db') # 在Windows 中使用原始字符串 # 使用内存作为数据库容器
engine = create_engine('sqlite://')
engine = create_engine('sqlite:///:memory:')

py-sqlite3连接SQLITE

python内部已经自带了连接sqlite的模块和sqlite数据库引擎,不需要安装。

创建连接

import sqlite3
conn = sqlite3.connect('/tmp/test.db') # 连接指定位置的数据库文件,俄国不存在将被创建
conn.close() # 关闭连接 # 由于关闭连接连接这个操作很频繁并且必要,提供了基于上下文管理的功能
with sqlite3.connect('/tmp/test.db') as conn:
"do something.."

执行sql语句

# 我们通过获取游标来执行语句
with sqlite3.connect('/tmp/test.db') as conn:
cu = conn.cursor()
cu.execute('select * from users WHERE username=xiao') # 执行SQL语句
cu.close() # 关闭游标
conn.commit() # 提交 cu.execute('select * from users WHERE username=xiao') # 执行一条SQL语句
cu.executemany("insert into test values(?, ?, ?)", [(),(),()]) # 执行多条SQL语句
  • 注意execute函数的第二个参数必须是元组,否则报错。

  • 注意不要采用拼接字符串的方式写SQL语句,否则容易遭到注入攻击。

x = 'xiao'
cu.execute('select * from users WHERE username=%s'%x) # 这种方式不可取 # 使用?作为占位符
cu.execute('select * from users WHERE username=?',('xiao',))
  • 获取查询结果
ls = cu.execute('select * from users WHERE username=?',('xiao',)) # 返回一个迭代器
ls.fetchone() # 一条记录的元组
ls.fetchall() # 一个元组列表,查询后最好取一次,因为迭代器不可逆
ls.fetchmany(size) # 指定获取的数目,返回一个列表,无参数默认获取所有
  • 常用的方法
conn.commit():事务提交
conn.rollback():事务回滚
conn.close():关闭一个数据库连接
conn.cursor():创建一个游标

典型代码结构

# 插入一条数据

import sqlite3
from sqlite3 import Connection
from contextlib import contextmanager
from decorator import decorator # 使用上下文管理器管理游标
@contextmanager
def get_cursor(conn:Connection):
cu = conn.cursor()
try:
yield cu
finally:
cu.close() with sqlite3.connect(ADDRESS_SQL_LOCAL) as conn:
with get_cursor(conn) as cu:
try:
cu.execute('insert into users(username,sex,age,tele) VALUES (?,?,?,?)',
(kwargs.get('username'),
kwargs.get('sex', 'M'),
kwargs.get('age', 20),
kwargs.get('tele', '')))
conn.commit()
return 1
except Exception as e:
conn.rollback() # 存在异常需要回滚数据
raise Exception('insert the data:{}'.format(e))

参考

python模块分析之sqlite3数据库的更多相关文章

  1. 【转】python模块分析之collections(六)

    [转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...

  2. 【转】python模块分析之unittest测试(五)

    [转]python模块分析之unittest测试(五) 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) p ...

  3. 【转】python模块分析之typing(三)

    [转]python模块分析之typing(三) 前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度 ...

  4. 【转】python模块分析之hashlib加密(二)

    [转]python模块分析之hashlib加密(二) hashlib模块是用来对字符串进行hash加密的模块,明文与密文是一一对应不变的关系:用于注册.登录时用户名.密码等加密使用.一.函数分析:1. ...

  5. 【转】python模块分析之logging日志(四)

    [转]python模块分析之logging日志(四) python的logging模块是用来写日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分 ...

  6. python模块分析之typing(三)

    前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...

  7. python模块分析之logging日志(四)

    前言 python的logging模块是用来设置日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块 ...

  8. python模块分析之hashlib加密(二)

    前言 hashlib模块是py3.+用来对字符串进行hash加密的模块,核心算法是md5,明文与密文是一一对应不变的关系:用于注册.登录时用户名.密码等加密使用. 模块分析 hashlib模块有多种加 ...

  9. python django中使用sqlite3数据库 存储二进制数据ByteArray

    在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...

随机推荐

  1. IIS部署时failed to execute url 解决方法

    web.config中增加如下节点: <system.webServer>  <validation validateIntegratedModeConfiguration=&quo ...

  2. puthon进程开发

    进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mutiprocess.P ...

  3. BZOJ4888 Tjoi2017异或和(树状数组)

    化为前缀和相减.考虑每一位的贡献.则需要快速查询之前有几个数和当前数的差在第k位上为1.显然其与更高位是无关的.于是用BIT维护后k位的数的出现次数,瞎算一算即可. // luogu-judger-e ...

  4. 洛谷P1352 没有上司的舞会——树形DP

    第一次自己写树形DP的题,发个博客纪念`- 题目来源:P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结 ...

  5. Halum UVA - 11478(差分约束 + 二分最小值最大化)

    题意: 给定一个有向图,每条边都有一个权值,每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后要让所有边权的最小值非负且尽量大 两个特判 1 ...

  6. 【刷题】BZOJ 1036 [ZJOI2008]树的统计Count

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. ...

  7. 已知UIScrollView放大后的Frame和放大之前的Frame计算放大的瞄点坐标

    有时候在缩放后,需要知道该次缩放是在哪个坐标开始缩放的.如上篇已知缩放的点,然后在该点对其缩放.本篇其实是逆运算 (x,y)就是当初在该点进行缩放 化简之后很简单,代码如下: func getZoom ...

  8. 谈谈 Java 类加载机制

    概述 类加载器主要分为两类,一类是 JDK 默认提供的,一类是用户自定义的. JDK 默认提供三种类加载器: Bootstrap ClassLoader 启动类加载器:每次执行 java 命令时都会使 ...

  9. S-T平面图

    给定一个平面图和一个源点S.汇点T都在图中无边界的区域上,这样的图叫S-T平面图 我们把图中每一个独立的面看做一个点,对于每条边e,将它两侧的面连一条边,其中靠近S的一段与S相连,与T相连的一段与T相 ...

  10. [ZJOI2015]幻想乡战略游戏——动态点分治

    [ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...