不同数据库还是有各自特点的,之前自以为熟悉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. dfs的一个小实现(啊哈算法的例题)

    给定n个盒子,将n个小球放进这些盒子里,判断都有多少种情况 写深度优先搜索最重要的是理解当前步怎么做,下一步就当系统已经帮你实现好了(因为只要写好当前步,下一步解决方法和当前步是一样的). #incl ...

  2. HBase之六:HBase的RowKey设计

    数据模型 我们可以将一个表想象成一个大的映射关系,通过行健.行健+时间戳或行键+列(列族:列修饰符),就可以定位特定数据,Hbase是稀疏存储数据的,因此某些列可以是空白的, Row Key Time ...

  3. linux创建定时任务,定时执行sql

    终于弄清楚一个问题了.linux创建定时任务,定时执行sql,其中分为两个case. case-1 sql语句较少,因此直接在 shell脚本中 写sql语句.如下: [oracle@Oracle11 ...

  4. Mybatis异常There is no getter for property named 'XXX' in 'class java.lang.String'

    1.当入参为 string类型时 (包括java.lang.String.)  我们使用#{xxx}引入参数.会抛异常There is no getter for property named 'XX ...

  5. Oracle date timestamp 毫秒 - 时间函数总结(转)

    原文地址:Oracle date timestamp 毫秒 - 时间函数总结 yyyy-mm-dd hh24:mi:ss.ff  年-月-日 时:分:秒.毫秒 --上一月,上一年select add_ ...

  6. [洛谷 P3787] 冰精冻西瓜

    题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的 ...

  7. ORA-12537:TNS:connectionclosed错误处理过程

    1.ORA-12537:TNS:connectionclosed错误处理过程 检查监听正常,oracle服务也是正常启动的,但是登录不进去. 2.解决方案 1. cd $ORACLE_HOME/bin ...

  8. python xlrd使用

    python xlrd使用 1● xlrd安装   管理员模式           success 2● 引用 import xlrd    

  9. python 自然语言处理(三)____条件频率分布

    条件频率分布就是频率分布的集合,每个频率分布有一个不同的“条件”,这个条件通常是文本的类别.当语料文本分为几类(文体,主题,作者等)时,可以计算每个类别独立的频率分布,这样,就可以通过条件频率分布研究 ...

  10. shell shell基本概述

    SHELL的概念 SHELL是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序, 用户可以用shell来启动,挂起,停止甚至是编写一些程序. ​ Shell还是 ...