Python SQLite 用法
具体可以参考网址
代码:
#导入
import sqlite3
#连接库,如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。
# test.db:数据路路径
conn = sqlite3.connect('test.db')
# 创建游标
c = conn.cursor()
# 创建表
c.execute('''CREATE TABLE TEST
(ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL);''')
# 插入数据
c.execute("INSERT INTO TEST (ID,NAME,AGE,ADDRESS,SALARY) \
VALUES (1, 'Paul', 32, 'California', 20000.00 )");
c.execute("INSERT INTO TEST (ID,NAME,AGE,ADDRESS,SALARY) \
VALUES (2, 'Allen', 25, 'Texas', 15000.00 )");
c.execute("INSERT INTO TEST (ID,NAME,AGE,ADDRESS,SALARY) \
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )");
c.execute("INSERT INTO TEST (ID,NAME,AGE,ADDRESS,SALARY) \
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 )");
# 读取数据
cursor = c.execute("SELECT id, name, address, salary from TEST")
# cursor = c.execute("SELECT similarity from consin where similarity = 'nan'")
for row in cursor:
print ("ID = ", row[0])
print ("NAME = ", row[1])
print ("ADDRESS = ", row[2])
print ("SALARY = ", row[3], "\n")
# 更正数据
c.execute("UPDATE TSET set SALARY = 25000.00 where ID=1")
# 删除数据
c.execute("DELETE from TEST where ID=2;")
conn.commit()
conn.close()
效果
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
自增长主键
SQLite不支持关键字AUTO_INCREMENT
AUTO_INCREMENT不生效的问题
在SQLite中,自增字段需要使用关键字INTEGER PRIMARY KEY
#导入
import sqlite3
#连接库,如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。
conn = sqlite3.connect('test.db')
# 创建游标
c = conn.cursor()
# 创建表
c.execute('''CREATE TABLE TEST1
(ID INTEGER PRIMARY KEY,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL);''')
# 插入数据
c.execute("INSERT INTO TEST1 (NAME,AGE,ADDRESS,SALARY) \
VALUES ('Paul', 32, 'California', 20000.00 )");
c.execute("INSERT INTO TEST1 (NAME,AGE,ADDRESS,SALARY) \
VALUES ('Allen', 25, 'Texas', 15000.00 )");
c.execute("INSERT INTO TEST1 (NAME,AGE,ADDRESS,SALARY) \
VALUES ('Teddy', 23, 'Norway', 20000.00 )");
c.execute("INSERT INTO TEST1 (NAME,AGE,ADDRESS,SALARY) \
VALUES ('Mark', 25, 'Rich-Mond ', 65000.00 )");
# 插入多条变量
#c.execute("insert into 表名 (字段a, 字段b, 字段c) values('{}','{}','{}')".format(变#量a, 变量b, 变量c))
# 读取数据
cursor = c.execute("SELECT id, name, address, salary from TEST1")
# cursor = c.execute("SELECT similarity from consin where similarity = 'nan'")
for row in cursor:
print ("ID = ", row[0])
print ("NAME = ", row[1])
print ("ADDRESS = ", row[2])
print ("SALARY = ", row[3], "\n")
# 更正数据
c.execute("UPDATE TSET1 set SALARY = 25000.00 where ID=1")
# 删除数据
c.execute("DELETE from TEST1 where ID=2;")
conn.commit()
conn.close()
封装好的代码:
#导入
import sqlite3
#连接库,如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。
# test.db:数据路路径
class Sqlite_opration():
def __init__(self,path):
self.path = path
self.conn = sqlite3.connect(self.path)
# 创建游标
self.c = self.conn.cursor()
def creat_table(self,sql_create):
# 创建表
self.c.execute(sql_create)
# 插入数据
def insert_data(self,sql_insert):
self.c.execute(sql_insert)
# 读取数据
def read_data(self, sql_read):
read = self.c.execute(sql_read)
return read
# 更正数据
def modif_data(self, sql_modif):
self.c.execute(sql_modif)
# 删除数据
def delete_data(self,sql_delete):
self.c.execute(sql_delete)
def __del__(self):
self.conn.commit()
self.conn.close()
# 实例化操作=================================================================================
path = 'test.db'
sql_create = '''CREATE TABLE TEST1
(ID INTEGER PRIMARY KEY,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50));'''
sql_insert = "insert into 表名 (NAME, AGE, ADDRESS) values('{}','{}','{}')".format('小李', 18, '中国')
sql_read = "SELECT id, , ADDRESS,AGE from TEST1"
sql_modif = "UPDATE TSET1 set ADDRESS = '美国' where ID=1"
sql_delete = "DELETE from TEST1 where ID=1;"
test1 = Sqlite_opration(path)
test1.creat_table(sql_create)
test1.insert_data(sql_insert)
read = test1.read_data(sql_read)
for row in read:
print("ID = ", row[0])
print("NAME = ", row[1])
print("AGE = ", row[2])
print("ADDRESS = ", row[3], "\n")
test1.modif_data(sql_modif)
test1.delete_data(sql_delete)
SQLite 3 中的数据类型
SQLite使用动态类型系统,在SQLite中,值的数据类型和值本身,而不是和它的容器,关联在一起的。(值的数据类型和值本身是关联在一起的)SQLite的动态类型系统和其他数据库引擎的静态类型系统是兼容的,这样在静态类型的数据库上执行的SQL语句也可以在SQLite中执行。
1.0 存储类(storage class)和数据类型
每个存储在SQLite数据库中(或被数据库引擎操纵的)的值都有下列存储类的一个:
- NULL。空值。
- INTEGER。有符号整数,存储在1、2、3、4、6或8个字节中。
- REAL。浮点数,存储为8字节的IEEE浮点数。
- TEXT。文本串,使用数据库编码(UTF-8, UTF-16BE或UTF-16LE)存储。
- BLOB。大块数据。
注意存储类(storage class)比数据类型更一般。INTEGER存储类,例如,包含6种长度不同的整数数据类型。这在磁盘中是有区别的。不过一旦INTEGER值从磁盘读到内存中进行处理的时候,这些值会转化为更普通的数据类型(8位有符号整数)。因此在大部分情况下,存储类和数据类型是不易分辨的,这两个术语可以交换使用。
在SQLite 3 数据库中,任何列,除了INTEGER PRIMARY KEY列,都可以存储任何存储类的值。
SQL语句中的所有值,不管是SQL语句中嵌入的字面值,还是预编译的SQL语句中的参数,都有一个隐式的存储类。在下面描述的条件下,在查询执行阶段,数据库引擎可能会在数字存储类(INTEGER和REAL)和TEXT存储类之间转换。(转换为数字存储类、或者转换为TEXT存储类)
1.1 Boolean数据类型
SQLite没有单独的Boolean存储类,相反,Booean值以整数0(false)和1(true)存储。
1.2 日期和时间数据类型
SQLite没有为存储日期和/或时间设置专门的存储类,相反,内置的日期和时间函数能够把日期和时间作为TEXT,REAL或INTEGER值存储: - TEXT:作为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
- REAL:作为Julian天数,……(原文:as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.)
- INTEGER:作为Unix Time,即自1970-01-01 00:00:00 UTC以下的秒数。
2.0 类型相像(type affinity)
为了最大化SQLite和其他数据库引擎之间的兼容性,SQLite支持列的“类型相像”的概念。这里重要的思想是,类型是推荐的,不是必需的。任何列仍然能够存储任何类型的数据。只是某些列,能够选择优先使用某种存储类。这个对列的优先存储类称作它的“相像”。
SQLite 3 数据库中的每个列都赋予下面类型相像中的一个: - TEXT
- NUMERIC
- INTEGER
- REAL
- NONE
带有TEXT相像的列会使用存储类NULL、TEXT或BLOB来存储所有的数据。如果数据数据被插入到带有TEXT相像的列中,它会在插入前转换为文本格式。
带有NUMERIC相像的列可以使用所有5个存储类来包含值。当文本数据被插入到一个NUMERIC列,文本的存储类会被转换成INTEGER或 REAL(为了优先),如果这个转换是无损的和可逆的话。如果TEXT到INTEGER或REAL的转换是不可能的,那么值会使用TEXT存储类存储。不 会试图转换NULL或BLOB值。
……
2.1 列相像的确定
列相像是由列声明的类型确定的,规则是按照下面的顺序:
\1. 如果声明的类型包含字符串”INT“那么它被赋予INTEGER相像。
\2. 如果列声明的类型包含任何字符串”CHAR“,”CLOB“,或”TEXT“,那么此列拥有TEXT相像。注意类型VARCHAR包含”CHAR“,因此也会赋予TEXT相像。
\3. 如果列声明的类型包含”BLOB“或没有指定类型,那么此列拥有NONE相像。
\4. 如果列声明的类型包含任何”REAL“,”FLOA“,或”DOUB“,那么此列拥有REAL相像。
\5. 其他情况,相像是NUMERIC。
注意规则的顺序是重要的。声明类型为“CHARINT”的列同时匹配规则1和规则2,但第一个规则会优先采用,因此此列的相像是INTEGER。
2.2 相像示例
示例 | 相像结果 | 规则 |
---|---|---|
INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8 | INETGER | 1 |
CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOB | TEXT | 2 |
BLOB 未指定数据类型 | NONE | 3 |
REAL DOUBLE DOUBLE PRECISION FLOAT | REAL | 4 |
NUMERIC DECIMAL(10, 5) BOOLEAN DATE DATETIME | NUMERIC | 5 |
NT”类型会指定INTEGER相像,而不是REAL相像,因为”INT“在末尾。”STRING“类型会拥有NUMERIC相像,而不是TEXT。