不同数据库还是有各自特点的,之前自以为熟悉mysql,然后全都照搬到sqlite3上,这样果然是不行的。笔者就近期在使用sqlite3时碰到的问题做了总结分析,并给出相应解决方法,供大家参考。

1、如何insert一条记录?

示例如下,其中sql语句中的%d、’%s’均为占位符,注意字符串占位符需要加引号,在执行时会被%(…)中的mid、mname等变量替换。

import sqlite3
conn = sqlite3.connect("movie.db")
msql = "insert into movieinfo(mid,mname, myear, mgenre, mruntime, rank, mrating, link) values(%d, '%s', %d, '%s','%s', '%s', %f, '%s')"%(mid, mname, myear, mgenre, mruntime, rank,mrating, link)
conn.execute(msql)

2、如何清空数据表?

示例如下。sql标准中有TRUNCATE TABLE语句,用来清空表的所有内容;对于大多数DBMS来说,用DELETE不如用TRUNCATE速度快,但sqlite3不支持该语句。在sqlite3中直接使用“DELETE FROM TableName”就行,而且它对DELETE做了优化,速度比普通的逐条DELETE要快得多。

dsql = "delete from movieinfo"
conn.execute(dsql)

3、如果待insert的变量中有单引号?

如果变量中有单引号,例如待插入的字符串变量mname值为movie’s name,变量中的单引号会和占位符’%s’外的引号产生闭合,从而导致插入错误。而且这样的单引号如果被黑客利用,可能导致程序被sql注入的安全问题。

最好的解决方案,是遵循官方建议,不用诸如%d和’%s’的占位符,而统一用?作为占位符,这样sqlite3会根据情况自动处理字符串中的各种特殊字符;不仅可以避免插入错误,也可以有效防止程序被入侵。示例如下,注意%要用,替换:

msql = "insert into movieinfo(mid,mname, myear, mgenre, mruntime, rank, mrating, link) values(?, ?, ?, ?, ?, ?, ?,?)", (mid, mname, myear, mgenre, mruntime, rank, mrating, link)
conn.execute(msql)

4、如果待insert的变量中有Unicode字符?

如果变量中有unicode字符,例如待插入的字符串变量mname值为u'\u4e2d\u6587';此时如采用问题3中的sql语句,也依然会出现无法成功插入的问题。此时,可以使用带参数的sql语句处理,示例如下:

msql = "insert into movieinfo(mid,mname, myear, mgenre, mruntime, rank, mrating, link) values(?, ?, ?, ?, ?, ?, ?,?)"
parameter = [mid, mname, myear, mgenre,mruntime, rank, mrating, link]
conn.execute(msql, parameter)

5、如果待insert的变量中存在主键重复问题?

当原始数据中存在主键重复(例如:id)的记录,我们又想将所有记录插入到数据库中,可以使用insert or replace语句。这样,id重复的记录只保留最后一项(即先插入的记录被后插入的记录替换),示例如下:

msql = "insert or replace intomovieinfo(mid, mname, myear, mgenre, mruntime, rank, mrating, link) values(?, ?,?, ?, ?, ?, ?, ?)"
parameter = [mid, mname, myear, mgenre,mruntime, rank, mrating, link]
conn.execute(msql, parameter)

6、如果想一次insert多条记录?

虽然无法使用预先准备的多条sql语句进行批量insert操作,但sqlite3依然提供同时插入多条记录的工具executemany()。示例如下,注意execute()语句已经更换为executemany():

msql = "insert or replace intomovieinfo(mid, mname, myear, mgenre, mruntime, rank, mrating, link) values(?, ?,?, ?, ?, ?, ?, ?)"
parameters = [(mid1, mname1, myear1, mgenre1,mruntime1, rank1, mrating1, link1), (mid2, mname2, myear2, mgenre2, mruntime2,rank2, mrating2, link2)]
conn.executemany(msql, parameters)

7、如果出现”database islocked”问题?

相信会有不少人碰到OperationalError: database is locked问题,网上最常见的解释是sqlite3不支持多线程操作,如果多个进程同时操作同一个数据库会导致数据库锁死。此时,如果问题重复出现,可能需要考虑换数据库。

但是另一种可能性其实是,在一些操作没有结束时,就进行了下一步的操作(可以通过检查文件下是否有一个*.db-journal文件来确认,正常是没有此文件的)。例如现在执行conn.execute("delete from movieinfo"),文件夹下会产生一个movieinfo.db-journal文件,表明该会话没有处理完成;此时如果对数据库做其它操作,则会抛出“OperationalError: database is locked”异常。

如果在执行完清空数据表操作后,立即提交conn.commit(),则.db-journal文件消失,表明所有会话已经完成;此时再进行其它操作,就不会有问题了。

python操作sqlite3的几项问题分析的更多相关文章

  1. 《Python操作SQLite3数据库》快速上手教程

    为什么使用SQLite数据库? 对于非常简单的应用而言,使用文件作为持久化存储通常就足够了,但是大多数复杂的数据驱动的应用需要全功能的关系型数据库.SQLite的目标则是介于两者之间的中小系统.它有以 ...

  2. Python操作Mysql之基本操作

    pymysql python操作mysql依赖pymysql这个模块 下载安装 pip3 install pymysql 操作mysql python操作mysql的时候,是通过”游标”来进行操作的. ...

  3. Python开发【第十一篇】:Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 1.原生模块pymsql. 2.ORM框架SQLAchemy. pymsql pymsql是Python中操作MySQL的模块,其使用方法和MyS ...

  4. Flask:操作SQLite3(0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 本文介绍了第一次在Flask框架中操作SQLite3数据库的测试,参考了官网的文档Using SQLite 3 wit ...

  5. 孤荷凌寒自学python第四十四天Python操作 数据库之准备工作

     孤荷凌寒自学python第四十四天Python操作数据库之准备工作 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天非常激动地开始接触Python的数据库操作的学习了,数据库是系统化设计 ...

  6. Python操作MySQL[转]

    本篇对于Python操作MySQL主要使用两种方式: 1.原生模块pymsql. 2.ORM框架SQLAchemy. pymsql pymsql是Python中操作MySQL的模块,其使用方法和MyS ...

  7. Python操作SQLite数据库的方法详解

    Python操作SQLite数据库的方法详解 本文实例讲述了Python操作SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite简单介绍 SQLite数据库是一款非常小巧的嵌入式开 ...

  8. python——操作Redis

    在使用django的websocket的时候,发现web请求和其他当前的django进程的内存是不共享的,猜测django的机制可能是每来一个web请求,就开启一个进程去与web进行交互,一次来达到利 ...

  9. ofbiz进击 。 ofbiz 退货流程(包含获取可退货项流程分析 以及 取消退货项的过程分析)

    根据订单获取可退货项流程分析 退货的时候,调用 services_return.xml 中的获取可进行退货的退货项  getReturnableItems  ,该服务调用了Java类 org.ofbi ...

随机推荐

  1. Roman To Integer leetcode java

    问题描述: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range fr ...

  2. DVWA-CSRF

    Low等级   image 抓包   image 正常跳转   image   image 在这里我们把密码改为qwer   image   image   image   image   image ...

  3. win10 中redis client提示 ERR Client sent AUTH,but no password is set

    [问题原因]Redis服务器没有设置密码,但客户端向其发送了AUTH(authentication,身份验证)请求. [解决办法] 确定Redis启动时指定是哪个配置文件 如上图是 redis.win ...

  4. HBase环境搭建、shell操作及Java API编程

    一. 1.掌握Hbase在Hadoop集群体系结构中发挥的作用和使过程. 2.掌握安装和配置HBase基本方法. 3.掌握HBase shell的常用命令. 4.使用HBase shell命令进行表的 ...

  5. Hadoop--之RPC开发

    Hadoop--之RPC开发   介绍: 百度百科: RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.R ...

  6. html 巧用data-for藏自定义属性

    <div class="form-ele"> <label for="week" class="label col-1"& ...

  7. ssh免输入密码登录

    ssh免输入密码登录   ubuntu下生成ssh密钥参见.   https://confluence.atlassian.com/display/BITBUCKET/Use+the+SSH+prot ...

  8. 蓝桥杯—BASIC-25 回形取数

    题目:回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下.输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m行每行 ...

  9. (路-莫)-Python基础一

    一,Python介绍 1,python的出生与应用 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打 ...

  10. day05 可变不可变类型

    #可变类型: 值变了,但是id没有变,证明没有生成新的值而是在改变原值,原值是可变类型#不可变类型:值变了,id也跟着变,证明是生成了新的值而不是在改变原值,原值是不可变 # x=10# print( ...