13.2. Python 操作SQLite数据库

13.2.1. 连接数据库

下面的 Python 代码显示了如何连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。
#!/usr/bin/python

import sqlite3

conn = sqlite3.connect('test.db')

print "Opened database successfully";
在这里,您也可以把数据库名称复制为特定的名称 :memory:,这样就会在 RAM 中创建一个数据库。现在,让我们来运行上面的程序,在当前目录中创建我们的数据库 test.db。您可以根据需要改变路径。保存上面代码到 sqlite.py 文件中,并按如下所示执行。如果数据库成功创建,那么会显示下面所示的消息:

$chmod +x sqlite.py
$./sqlite.py
Open database successfully

13.2.2. 创建表

下面的 Python 代码段将用于在先前创建的数据库中创建一个表:
#!/usr/bin/python

import sqlite3

conn = sqlite3.connect('test.db')
print "Opened database successfully";
c = conn.cursor()
c.execute('''CREATE TABLE COMPANY
       (ID INT PRIMARY KEY     NOT NULL,
       NAME           TEXT    NOT NULL,
       AGE            INT     NOT NULL,
       ADDRESS        CHAR(50),
       SALARY         REAL);''')
print "Table created successfully";
conn.commit()
conn.close()
上述程序执行时,它会在 test.db 中创建 COMPANY 表,并显示下面所示的消息:

Opened database successfully
Table created successfully

13.2.3. INSERT 操作

下面的 Python 程序显示了如何在上面创建的 COMPANY 表中创建记录:
#!/usr/bin/python

import sqlite3

conn = sqlite3.connect('test.db')
c = conn.cursor()
print "Opened database successfully";

c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
      VALUES (1, 'Paul', 32, 'California', 20000.00 )");

c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
      VALUES (2, 'Allen', 25, 'Texas', 15000.00 )");

c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
      VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )");

c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
      VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 )");

conn.commit()
print "Records created successfully";
conn.close()
上述程序执行时,它会在 COMPANY 表中创建给定记录,并会显示以下两行:

Opened database successfully
Records created successfully

13.2.4. SELECT 操作

下面的 Python 程序显示了如何从前面创建的 COMPANY 表中获取并显示记录:
#!/usr/bin/python

import sqlite3

conn = sqlite3.connect('test.db')
c = conn.cursor()
print "Opened database successfully";

cursor = c.execute("SELECT id, name, address, salary  from COMPANY")
for row in cursor:
   print "ID = ", row[0]
   print "NAME = ", row[1]
   print "ADDRESS = ", row[2]
   print "SALARY = ", row[3], "\n"

print "Operation done successfully";
conn.close()
上述程序执行时,它会产生以下结果:

Opened database successfully
ID =  1
NAME =  Paul
ADDRESS =  California
SALARY =  20000.0

ID =  2
NAME =  Allen
ADDRESS =  Texas
SALARY =  15000.0

ID =  3
NAME =  Teddy
ADDRESS =  Norway
SALARY =  20000.0

ID =  4
NAME =  Mark
ADDRESS =  Rich-Mond
SALARY =  65000.0

Operation done successfully

13.2.5. UPDATE 操作

下面的 Python 代码显示了如何使用 UPDATE 语句来更新任何记录,然后从 COMPANY 表中获取并显示更新的记录:
#!/usr/bin/python

import sqlite3

conn = sqlite3.connect('test.db')
c = conn.cursor()
print "Opened database successfully";

c.execute("UPDATE COMPANY set SALARY = 25000.00 where ID=1")
conn.commit()
print "Total number of rows updated :", conn.total_changes

cursor = conn.execute("SELECT id, name, address, salary  from COMPANY")
for row in cursor:
   print "ID = ", row[0]
   print "NAME = ", row[1]
   print "ADDRESS = ", row[2]
   print "SALARY = ", row[3], "\n"

print "Operation done successfully";
conn.close()
上述程序执行时,它会产生以下结果:

Opened database successfully
Total number of rows updated : 1
ID =  1
NAME =  Paul
ADDRESS =  California
SALARY =  25000.0

ID =  2
NAME =  Allen
ADDRESS =  Texas
SALARY =  15000.0

ID =  3
NAME =  Teddy
ADDRESS =  Norway
SALARY =  20000.0

ID =  4
NAME =  Mark
ADDRESS =  Rich-Mond
SALARY =  65000.0

Operation done successfully

13.2.6. DELETE 操作

下面的 Python 代码显示了如何使用 DELETE 语句删除任何记录,然后从 COMPANY 表中获取并显示剩余的记录:
#!/usr/bin/python

import sqlite3

conn = sqlite3.connect('test.db')
c = conn.cursor()
print "Opened database successfully";

c.execute("DELETE from COMPANY where ID=2;")
conn.commit()
print "Total number of rows deleted :", conn.total_changes

cursor = conn.execute("SELECT id, name, address, salary  from COMPANY")
for row in cursor:
   print "ID = ", row[0]
   print "NAME = ", row[1]
   print "ADDRESS = ", row[2]
   print "SALARY = ", row[3], "\n"

print "Operation done successfully";
conn.close()


上述程序执行时,它会产生以下结果:
Opened database successfully
Total number of rows deleted : 1
ID =  1
NAME =  Paul
ADDRESS =  California
SALARY =  20000.0

ID =  3
NAME =  Teddy
ADDRESS =  Norway
SALARY =  20000.0

ID =  4
NAME =  Mark
ADDRESS =  Rich-Mond
SALARY =  65000.0

Operation done successfully

13.2.7. Pyhton操作SQLite数据库案例

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/6/24 17:02
# filename: SQLite3操作数据库.py
import sqlite3
import random

src = "abcdefghijklmnopqrstuvwxyz"


def get_str(x, y):
    """ 生成随机数,x~y之间的随机字母字符串"""
    str_sum = random.randint(x, y)  # 产生x,y之间一个随机整数
    astr = ""
    for i in range(str_sum):
        astr += random.choice(src)
    return astr


def output():
    """
    定义输出数据库表中所有记录函数
    :return:
    """
    # 执行查询
    cur.execute("select * from mytab")

    # 遍历记录
    for sid, name, ps in cur:
        print(sid, " ", name, " ", ps)  # 输出记录


def out_put_all():
    """
    定义输出数据库表中所有记录函数
    :return:
    """
    cur.execute("select * from mytab")
    for item in cur.fetchall():
        print(item)  # 使用fetchall()函数


def get_data_list(n):
    """
    定义生成记录列表数据的函数
    :param n:
    :return:
    """
    res = []
    for i in range(n):
        res.append((get_str(2, 4), get_str(8, 12)))
    return res


if __name__ == '__main__':
    print("建立连接.......................")
    con = sqlite3.connect("mrsoft.db")  # 建立连接使用内存中的数据库
    # con = sqlite3.connect("test.db")  # 建立连接使用内存中的数据库
    print("建立游标.......................")
    cur = con.cursor()  # 获取游标
    print("创建一张表mytab.......................")
    cur.execute("create table mytab(id integer primary key autoincrement not null ,name text ,passwd text)")
    print("插入一条记录.......................")
    cur.execute("insert into mytab(name,passwd)values (?,?)", (get_str(2, 4), get_str(8, 12),))  # 插入1条记录
    con.commit()
    output()                # 显示所有记录
    print("批量插入多条记录.......................")
    cur.executemany("insert into mytab(name,passwd)values (?,?)", get_data_list(3))  # 插入多条记录
    print("显示所有记录........................")
    con.commit()
    out_put_all()  # 显示所有记录
    print("更新一条记录..............")
    cur.execute("update mytab set name=? where id =?", ("aaa", 1))  # 更新记录
    print("显示所有记录.........................")
    con.commit()
    output()  # 显示所有记录
    print("删除一条记录.......................")
    cur.execute("delete from mytab where id=?", (3,))  # 删除一条记录
    con.commit()
    print("显示所有记录:")
    output()  # 显示所有记录
    cur.close()  # 关闭游标
    con.close()  # 关闭连接

输出信息

建立连接.......................
建立游标.......................
创建一张表mytab.......................
插入一条记录.......................
1   br   mzhourjabh
批量插入多条记录.......................
显示所有记录........................
(1, 'br', 'mzhourjabh')
(2, 'plgz', 'edgujqbe')
(3, 'mz', 'zzkcncpeoc')
(4, 'vxgv', 'xuyxfqkokw')
更新一条记录..............
显示所有记录.........................
1   aaa   mzhourjabh
2   plgz   edgujqbe
3   mz   zzkcncpeoc
4   vxgv   xuyxfqkokw
删除一条记录.......................
显示所有记录:
1   aaa   mzhourjabh
2   plgz   edgujqbe
4   vxgv   xuyxfqkokw

* 更新数据库后应该调用connect 对象的commit() 方法来保存更新结果。

1.导入Python SQLite数据模块

#导入模块
import sqlite3

2.建立数据库连接,返回Connection对象

#创建连接对象
conn = sqlite3.connect('mrsoft.db')

不仅可以在硬盘上创建数据库文件,还可以在内存中创建。


conn = sqlite3.connect(':memory:')

3.创建游标对象

#创建游标对象
cursor = conn.cursor()

4.使用cursor对象的execute()方法执行SQL命令,返回结果集

cur.execute(sql)                     #执行SQL语句
cur.execute(sql,parameters)          #执行带参数的SQL语句
cur.executemany(sql,sql_of_parameters) #根据参数执行多次SQL语句
cur.executesript(sql_script)           #执行SQL脚本

5.获取游标的查询结果集

cur.fetchone() #返回结果集的下一行(Row对象);无数据时返回None
cur.fetchall() #返回结果集的剩余行(Row对象列表);无数据时返回空List
cur.fetchmany() #返回结果集的多行(Row对象列表);无数据时返回空List

6.数据库的提交和回滚

根据数据库事务隔离级别的不同,可以提交和回滚。
con.commit()        #事务提交
con.rollback()      #事务回滚

7.关闭Cursor对象和Connection对象

最后需要关闭打开的Cursor对象和Connection对象
cur.close()    #关闭Cursor对象
con.close()    #关闭Connection对象

13.2.8. Python操作SQLite代码示例

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# import MySQLdb                #引入Python引擎包

# 连接本机数据库testDB
# conn = MySQLdb.connect(database="testDB", user="user1", password="password123",
#                         host="127.0.0.1", port=3306)

import os

if os.path.exists('test.db'):
    os.remove('test.db')

import sqlite3

conn = sqlite3.connect('test.db')

# 获取游标对象
cur = conn.cursor()

# 执行一系列SQL语句
# 建立一个表
cur.execute("CREATE TABLE demo(num int,str varchar(20));")
# 插入一些记录
cur.execute("INSERT INTO demo VALUES (%d, '%s')" % (1, 'aaa'))
cur.execute("INSERT INTO demo VALUES (%d, '%s')" % (2, 'bbb'))
cur.execute("INSERT INTO demo VALUES (%d, '%s')" % (3, 'ccc'))

# 更新一条记录
cur.execute("UPDATE demo SET str='%s' WHERE num = %d" % ('ddd', 3))

# 查询
cur.execute("SELECT * FROM demo;")
rows = cur.fetchall()
print("number of records: ", len(rows))
for i in rows:
    print(i)

# 提交事务
conn.commit()

# 关闭游标对象
cur.close()

# 关闭数据库连接
conn.close()

13.2.9. 操作SQLite的封装类

#!/usr/bin/env python
# -*- coding:utf8 -*-
# @auther:   18793
# @Date:    2020/7/17 15:31
# @filename: 操作SQLite.py
# @Email:    1879324764@qq.com
# @Software: PyCharm
import sqlite3


class MySqliteDb(object):
    """Sqlite3 Db Class"""

    def __init__(self, dbname="mys.db"):
        self.dbname = dbname
        self.con = None
        self.curs = None

    def getCursor(self):
        self.con = sqlite3.connect(self.dbname)
        if self.con:
            self.curs = self.con.cursor()

    def closeDb(self):
        if self.curs:
            self.curs.close()
        if self.con:
            self.con.commit()
            self.con.close()

    def __enter__(self):
        self.getCursor()
        return self.curs

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_val:
            print("Exception has generate: ", exc_val)
            print("Sqlite3 execute error!")
        self.closeDb()


if __name__ == '__main__':
    # 建立一个表
    with MySqliteDb() as db:
        sql = "Create TABLE demo(num int,str varchar(20))"
        db.execute(sql)

    # 插入一些数据记录
    sqls = ("insert into demo values (%d,\"%s\")" % (1, "aaa"),
            "insert into demo values (%d,\"%s\")" % (2, "bbb"),
            "insert into demo values (%d,\"%s\")" % (3, "ccc"),
            )

    with MySqliteDb() as db:
        for sql in sqls:
            db.execute(sql)

    # 更新一条记录
    with MySqliteDb() as db:
        sql = "update demo set str='%s' where num= %d" % ('ddd', 3)
        db.execute(sql)

    # 查询
    with MySqliteDb() as db:
        sql = "select * from demo;"
        db.execute(sql)
        rows = db.fetchall()
        print("number of records: ", len(rows))

        for row in rows:
            print(row)