Python SQLite 用法

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 INT8INETGER1
CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOBTEXT2
BLOB 未指定数据类型NONE3
REAL DOUBLE DOUBLE PRECISION FLOATREAL4
NUMERIC DECIMAL(10, 5) BOOLEAN DATE DATETIMENUMERIC5

NT”类型会指定INTEGER相像,而不是REAL相像,因为”INT“在末尾。”STRING“类型会拥有NUMERIC相像,而不是TEXT。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏华东的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值