python模块分析之sqlite3数据库
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数据库的更多相关文章
- 【转】python模块分析之collections(六)
[转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...
- 【转】python模块分析之unittest测试(五)
[转]python模块分析之unittest测试(五) 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) p ...
- 【转】python模块分析之typing(三)
[转]python模块分析之typing(三) 前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度 ...
- 【转】python模块分析之hashlib加密(二)
[转]python模块分析之hashlib加密(二) hashlib模块是用来对字符串进行hash加密的模块,明文与密文是一一对应不变的关系:用于注册.登录时用户名.密码等加密使用.一.函数分析:1. ...
- 【转】python模块分析之logging日志(四)
[转]python模块分析之logging日志(四) python的logging模块是用来写日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分 ...
- python模块分析之typing(三)
前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...
- python模块分析之logging日志(四)
前言 python的logging模块是用来设置日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块 ...
- python模块分析之hashlib加密(二)
前言 hashlib模块是py3.+用来对字符串进行hash加密的模块,核心算法是md5,明文与密文是一一对应不变的关系:用于注册.登录时用户名.密码等加密使用. 模块分析 hashlib模块有多种加 ...
- python django中使用sqlite3数据库 存储二进制数据ByteArray
在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...
随机推荐
- Spring学习-1 框架总览
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. spring ...
- Debugger DataSet 调试时查看DataSet
delphi 跟踪调试的时候查看DataSet数据记录 Ctrl+F7调试 增强工具DataSethttp://edn.embarcadero.com/article/40268 http://do ...
- LoadRunner脚本增强技巧之参数化(二)
特别提醒: 1.在形成数据池之后,数据库中的数据变化不会影响数据池中的数据. 2.数据文件一定要以一个空行结束,否则,最后一行输入的数据不会被参数所使用. 3.一般我们用到的很多的都是使用数据文件来保 ...
- zookeeper应用实例
创建持久节点和临时节点 ZooKeeper zk=new ZooKeeper(HOST,CLIENT_SESSION_TIMEOUT,new Watcher(){ @Override public v ...
- bzoj1061-[Noi2008]志愿者招募-单纯形 & 费用流
有\(n\)天,\(m\)类志愿者,一个第\(i\)类志愿者可以从第\(s_i\)天工作到第\(t_i\)天,第\(i\)天工作的志愿者不少于\(b_i\)个.每一类志愿者都有单价\(c_i\),问满 ...
- 【开发工具IDE】Eclipse相关配置
1. 修改workspace编码为UTF-8 1.1. 修改jsp编码为UTF-8 2. 修改字体 3. 添加系统中的JDK 4. 导入formatter模板 5. 修改maven配置文件 打开文件: ...
- BZOJ3560 DZY Loves Math V(欧拉函数)
对每个质因子分开计算再乘起来.使用类似生成函数的做法就很容易统计了. #include<iostream> #include<cstdio> #include<cmath ...
- innodb--表空间
MySQL把数据库中表结构的定义信息保存到数据库目录的.frm文件中. 在InnoDB中数据库中存储的数据及索引实际是存放在表空间里的(tablespace). 可以将每个基于InnoDB存储引擎的表 ...
- mysql group_concat方法用法
目前有三张表: 课程表: course,里面有student_id 学生表: student,里面有 name 字段 中间表(课程和学生一对多): course_student, 里面有 co ...
- mysql 自动记录数据插入及最后修改时间
总结: `uptime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 原文 应用场景: 1.在数据 ...