不同数据库还是有各自特点的,之前自以为熟悉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. 『cs231n』通过代码理解gan网络&tensorflow共享变量机制_上

    GAN网络架构分析 上图即为GAN的逻辑架构,其中的noise vector就是特征向量z,real images就是输入变量x,标签的标准比较简单(二分类么),real的就是tf.ones,fake ...

  2. python-django rest framework框架之dispatch方法源码分析

    1.Django的 CBV 中在请求到来之后,都要执行dispatch方法,dispatch方法根据请求方式不同触发 get/post/put等方法 class APIView(View): def ...

  3. leetcode-algorithms-3 Longest Substring Without Repeating Characters

    leetcode-algorithms-3 Longest Substring Without Repeating Characters Given a string, find the length ...

  4. mysql的五种日期和时间类型【转载】

    [mysql的五种日期和时间类型] mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期 ...

  5. HDFS shell操作及HDFS Java API编程

    HDFS shell操作及HDFS Java API编程 1.熟悉Hadoop文件结构. 2.进行HDFS shell操作. 3.掌握通过Hadoop Java API对HDFS操作. 4.了解Had ...

  6. Java线程池理解及用法

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

  7. etymon word write alb pain high alt increase large agency ag lose weight fat assist out~3

        1● alb   2● write =====>rait     1● alg 2● pain   痛,疼痛           1● alt 2● high   高         1 ...

  8. linux下uptime命令详解

    uptime uptime 另外还有一个参数 -V(大写),是用来查询版本的 procps是一个实用程序包,主要包括ps top kill等程序主要用来显示与控制一些系统信息,进程状态之类的内容. 以 ...

  9. java中JDBC连接数据库操作的基本步骤

    JDBC基本步骤 创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lan ...

  10. 在docker hub,用github的dockerfile自动生成docker镜像

    简介: 我已经深深的爱上了docker技术. 在日常使用中,经常看到docker hub 中有很多autobuild的镜像.基本使用是在github中上传dockerfile,过一会儿,docker ...