Python SQLite



Python SQLite

搞懂Python SQLite的基本操作

Python安装sqlite3

查看是Python是否有该库

使用http://django-china.cn/topic/413/ 查看自己Python库的路径,
 >>> import site; site.getsitepackages()
['/home/user/usr/python/python2.7/lib/python2.7/site-packages', '/home/user/usr/python/python2.7/lib/site-python']

进入 /home/user/usr/python/python2.7/lib/python2.7/lib-dynload

看看是否有_sqlite3.so这个文件,

发现没有这个文件,说明没有安装此扩展。

安装SQLITE3

下载 sqlite-autoconf-3080401.tar.gz

在 https://sqlite.org/download.html 这里下载。

安装方法是:

解压

./configure --prefix=/home/user/usr/db/sqlite

make

make install

重新安装python

不管有没有安装过Python,这里都必须重新进行安装。

编辑 setup.py

添加sqlite的搜索路径

查看是否已经安装成功

方法一:先看下Lib是否已经生成
还是在 /home/user/usr/python/python2.7/lib/python2.7/lib-dynload 下

发现了 _sqlite3.so 文件
方法二:使用python 命令
 >>> import sqlite3 

可以使用由Gerhard Haring编写的sqlite3模块将SQLite3与Python集成。它提供了一个符合PEP 249描述的DB-API 2.0规范的SQL接口。你不需要单独安装此模块,因为它是默认随Python 2.5.x版一起提供的。

要使用sqlite3模块,必须首先创建一个代表数据库的连接对象,然后可以选择创建一个游标对象,该对象将帮助你执行所有SQL语句。

Python SQLite3模块API

以下是重要的sqlite3模块例程,这些例程可以满足你从Python程序使用SQLite数据库的要求。如果你正在寻找更复杂的应用程序,则可以查看Python sqlite3模块的官方文档。
编号 API & 描述
1 sqlite3.connect(database [,timeout ,other optional arguments])
该API打开与SQLite数据库文件的连接。你可以使用“:memory:”打开与驻留在RAM中而不是磁盘上的数据库的数据库连接。如果数据库成功打开,它将返回一个连接对象。
2 connection.cursor([cursorClass])
此例程创建一个游标,该游标将在整个Python数据库编程中使用。此方法接受单个可选参数cursorClass。如果提供,则必须是扩展sqlite3.Cursor的自定义光标类。
3 cursor.execute(sql [, optional parameters])
该例程执行一条SQL语句。可以对SQL语句进行参数化(即,使用占位符代替SQL文字)。sqlite3模块支持两种占位符:问号和命名占位符(命名样式)。
例如: − cursor.execute("insert into people values (?, ?)", (who, age))
4 connection.execute(sql [, optional parameters])
此例程是游标对象提供的上述execute方法的快捷方式,它通过调用cursor方法创建中间游标对象,然后使用给定的参数调用游标的execute方法。
5 cursor.executemany(sql, seq_of_parameters)
此例程针对序列sql中找到的所有参数序列或映射执行SQL命令。
6 connection.executemany(sql[, parameters])
此例程是一种快捷方式,它通过调用cursor方法创建中间光标对象,然后使用给定的参数调用cursor.s executemany方法。
7 cursor.executescript(sql_script)
此例程以脚本形式一次执行多个SQL语句。它首先发出COMMIT语句,然后执行作为参数获取的SQL脚本。所有SQL语句都应以半冒号(;)分隔。
8 connection.executescript(sql_script)
该例程是一种快捷方式,它通过调用cursor方法来创建中间光标对象,然后使用给定的参数调用光标的executescript方法。
9 connection.total_changes()
此例程返回自打开数据库连接以来已被修改,插入或删除的数据库行的总数。
10 connection.commit()
此方法提交当前事务。如果不调用此方法,则从其他数据库连接中看不到自上次调用commit()以来所做的任何操作。
11 connection.rollback()
自上次调用commit()以来,此方法将回滚对数据库的所有更改。
12 connection.close()
此方法关闭数据库连接。请注意,这不会自动调用commit()。如果只关闭数据库连接而没有先调用commit(),则更改将丢失!
13 cursor.fetchone()
此方法获取查询结果集的下一行,返回单个序列,如果没有更多数据可用,则返回None。
14 cursor.fetchmany([size = cursor.arraysize])
该例程获取查询结果的下一组行,并返回一个列表。当没有更多行可用时,将返回一个空列表。该方法尝试获取由size参数指示的尽可能多的行。
15 cursor.fetchall()
该例程获取查询结果的所有(剩余)行,并返回一个列表。如果没有可用的行,则返回一个空列表。

SQLite建立连接

要建立与SQLite Open命令提示符的连接,浏览安装SQLite的位置,然后执行命令sqlite3,如下所示-

Python SQLite_https://bianchenghao6.com_【Python3 教程】_第1张

使用Python建立连接

你可以使用SQLite3 python模块与SQLite2数据库进行通信。为此,首先需要建立一个连接(创建一个连接对象)。

要使用python与SQLite3数据库建立连接,你需要-

使用import语句导入sqlite3模块。
connect()方法将你需要连接的数据库的名称作为参数接受,并返回一个Connection对象。

实例

 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
conn = sqlite3.connect('example.db')

执行结果:

 print("Connection established ..........")

SQLite创建表

使用SQLite CREATE TABLE语句,你可以在数据库中创建表。

语法

以下是在SQLite数据库中创建表的语法-
 CREATE TABLE database_name.table_name(
   column1 datatype PRIMARY KEY(one or more columns),
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype
);

实例

以下SQLite查询/语句在SQLite数据库中创建一个名为
CRICKETERS的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Age int,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255)
);
sqlite>

让我们再创建一个表OdiStats,用于描述CRICKETERS表中每个球员的一日板球统计数据。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE ODIStats (
   First_Name VARCHAR(255),
   Matches INT,
   Runs INT,
   AVG FLOAT,
   Centuries INT,
   HalfCenturies INT
);
sqlite>

你可以使用.tables命令获取SQLite数据库中数据库中的表列表。创建表格后,如果你可以验证表格列表,则可以在其中观察到新创建的表格,如下所示:
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> . tables
CRICKETERS ODIStats
sqlite>

使用Python创建表

Cursor对象包含执行查询和获取数据等的所有方法。连接类的cursor方法返回一个光标对象。

因此,要使用python在SQLite数据库中创建表-

使用connect()方法与数据库建立连接。
现在,使用Cursor类的execute()方法执行CREATE TABLE语句。
通过在上面创建的连接对象上调用cursor()方法来创建游标对象。

实例

以下Python程序在SQLite3中创建一个名为Employee的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接到sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
# 删除已存在的表
cursor.execute("DROP TABLE if EXISTS EMPLOYEE")
# 按要求创建表
sql ='''CREATE TABLE EMPLOYEE(
   FIRST_NAME CHAR(20) not NULL,
   LAST_NAME CHAR(20),
   AGE INT,
   SEX CHAR(1),
   INCOME FLOAT
)'''
cursor.execute(sql)
print("Table created successfully........")
# 提交
conn.commit()
# 关闭连接
conn.close()

Output

 Table created successfully........

SQLite插入数据

你可以使用INSERT INTO语句将新行添加到SQLite的现有表中。在这种情况下,你需要指定表的名称,列名称和值(与列名称的顺序相同)。

语法

以下是INSERT语句的建议语法-
 INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
   VALUES (value1, value2, value3,...valueN);

其中,column1,column2,column3,..是表的列名,而value1,value2,value3,...是你需要插入表中的值。

实例

假设我们使用CREATE TABLE语句创建了一个名称为CRICKETERS的表,如下所示-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Age int,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255)
);
sqlite>

以下PostgreSQL语句在上面创建的表中插入一行。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> insert into CRICKETERS (First_Name, Last_Name, Age, Place_Of_Birth, Country)
   values('Shikhar', 'Dhawan', 33, 'Delhi', 'India');
sqlite>

在使用INSERT INTO语句插入记录时,如果你跳过任何列名,则将插入该记录,在你跳过的列上留下空白。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> insert into CRICKETERS (First_Name, Last_Name, Country)
   values ('Jonathan', 'Trott', 'SouthAfrica');
sqlite>

如果你传递的值的顺序与表中它们各自的列名相同,则也可以在不指定列名的情况下将记录插入表中。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> insert into CRICKETERS values('Kumara', 'Sangakkara', 41, 'Matale', 'Srilanka');
sqlite> insert into CRICKETERS values('Virat', 'Kohli', 30, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Rohit', 'Sharma', 32, 'Nagpur', 'India');
sqlite>

将记录插入表后,你可以使用SELECT语句验证其内容,如下所示-
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> select * from cricketers;
Shikhar  |Dhawan     | 33 | Delhi | India
Jonathan |Trott      |    |       | SouthAfrica
Kumara   |Sangakkara | 41 | Matale| Srilanka
Virat    |Kohli      | 30 | Delhi | India
Rohit    |Sharma     | 32 | Nagpur| India
sqlite>

使用Python插入数据

要将记录添加到SQLite数据库中的现有表中-

导入sqlite3包。
通过将数据库名称作为参数传递给它,使用connect()方法创建一个连接对象。
cursor()方法返回使用你可以与sqlite3的通信的光标对象。通过调用(上面创建的)Connection对象上的cursor()对象来创建光标对象。
然后,通过将INSERT语句作为参数传递给游标对象,从而调用execute()方法。

实例

以下python示例将记录插入到名为EMPLOYEE的表中-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
# Preparing SQL queries to INSERT a record into the database.
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Ramya', 'Rama Priya', 27, 'F', 9000)'''
)
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Vinay', 'Battacharya', 20, 'M', 6000)''')
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Sharukh', 'Sheik', 25, 'M', 8300)''')
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Sarmista', 'Sharma', 26, 'F', 10000)''')
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Tripthi', 'Mishra', 24, 'F', 6000)''')
# 在数据库中提交更改
conn.commit()
print("Records inserted........")
# 关闭连接
conn.close()

输出结构

 Records inserted........

SQLite查询数据

你可以使用SELECT查询从SQLite表中检索数据。该查询/语句以表格形式返回指定关系(表)的内容,称为结果集。

语法

以下是SQLite中SELECT语句的语法-
 SELECT column1, column2, columnN from table_name;

实例

假设我们使用以下查询创建了一个名为CRICKETERS的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Age int,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255)
);
sqlite>

如果我们使用INSERT语句将5条记录插入其中-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> insert into CRICKETERS values('Shikhar', 'Dhawan', 33, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Jonathan', 'Trott', 38, 'CapeTown', 'SouthAfrica');
sqlite> insert into CRICKETERS values('Kumara', 'Sangakkara', 41, 'Matale', 'Srilanka');
sqlite> insert into CRICKETERS values('Virat', 'Kohli', 30, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Rohit', 'Sharma', 32, 'Nagpur', 'India');
sqlite>

SELECT查询之后,从CRICKETERS表中检索FIRST_NAME,LAST_NAME和COUNTRY列的值。
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT FIRST_NAME, LAST_NAME, COUNTRY FROM CRICKETERS;
Shikhar   |Dhawan       |India
Jonathan  |Trott        |SouthAfrica
Kumara    |Sangakkara   |Srilanka
Virat     |Kohli        |India
Rohit     |Sharma       |India
sqlite>

如你所见,SQLite数据库的SELECT语句仅返回指定表的记录。为了获得格式化的输出,你需要在SELECT语句之前使用相应的命令设置标头和模式,如下所示-
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> .header on
sqlite> .mode column
sqlite> SELECT FIRST_NAME, LAST_NAME, COUNTRY FROM CRICKETERS;
First_Name   Last_Name    Country
----------   ----------   ----------
Shikhar      Dhawan       India
Jonathan     Trott        SouthAfric
Kumara       Sangakkara   rilanka
Virat        Kohli        India
Rohit        Sharma       India

如果要检索每个记录的所有列,则需要用“ *”替换列名,如下所示:
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> .header on
sqlite> .mode column
sqlite> SELECT * FROM CRICKETERS;
First_Name   Last_Name    Age        Place_Of_Birth   Country
----------   ----------   -------    --------------   ----------
Shikhar      Dhawan       33         Delhi            India
Jonathan     Trott        38         CapeTown         SouthAfric
Kumara       Sangakkara   41         Matale           Srilanka
Virat        Kohli        30         Delhi            India
Rohit        Sharma       32         Nagpur           India
sqlite>

默认情况下,在SQLite中,列的宽度是10个超出该宽度的值(请注意上表中第二行的国家/地区列)。你可以在检索表内容之前,使用.width命令将每列的宽度设置为所需值,如下所示-
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> .width 10, 10, 4, 10, 13
sqlite> SELECT * FROM CRICKETERS;
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   --------
Shikhar      Dhawan       33     Delhi        India
Jonathan     Trott        38     CapeTown     SouthAfrica
Kumara       Sangakkara   41     Matale       Srilanka
Virat        Kohli        30     Delhi        India
Rohit        Sharma       32     Nagpur       India
sqlite>

使用Python检索数据

任何数据库上的READ操作意味着要从数据库中获取一些有用的信息。你可以使用sqlite python模块提供的fetch()方法从MYSQL获取数据。
sqlite3.Cursor类提供了三种方法,分别是fetchall(),fetchmany()和fetchone(),其中,

fetchall()方法检索查询结果集中的所有行,并将它们作为元组列表返回。(如果我们在检索到几行之后执行此操作,它将返回剩余的行)。
fetchone()方法获取查询结果中的下一行,并将其作为元组返回。
fetchmany()方法类似于fetchone(),但是它检索查询结果集中的下一组行,而不是单行。

注意:结果集是使用游标对象查询表时返回的对象。

实例

下面的示例使用SELECT查询获取EMPLOYEE表的所有行,并最初从获得的结果集中获取数据,首先使用fetchone()方法检索第一行,然后使用fetchall()方法获取其余行。

以下Python程序演示了如何从上面的示例中创建的COMPANY表中获取并显示记录。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
# 检索数据
cursor.execute('''SELECT * from EMPLOYEE''')
# 正在从表中获取第一行
result = cursor.fetchone();
print(result)
result = cursor.fetchall();
print(result)
# 在数据库中提交更改
conn.commit()
# 关闭连接
conn.close()

输出结果:

 ('Ramya', 'Rama priya', 27, 'F', 9000.0)
[
   ('Vinay', 'Battacharya', 20, 'M', 6000.0),
   ('Sharukh', 'Sheik', 25, 'M', 8300.0),
   ('Sarmista', 'Sharma', 26, 'F', 10000.0),
   ('Tripthi', 'Mishra', 24, 'F', 6000.0)
]

SQLite Where查询

如果要在SQLite中获取,删除或更新表的特定行,则需要使用where子句指定条件以过滤该操作的表行。

例如,如果你有一条带where子句的SELECT语句,则仅检索满足指定条件的行。

语法

 SELECT column1, column2, columnN
from table_name
WHERE [search_condition]

你可以使用比较或逻辑运算符指定search_condition。例如>,<,=,LIKE,NOT等。以下示例将使这个概念更清楚。

例如

假设我们使用以下查询创建了一个名为CRICKETERS的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Age int,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255)
);
sqlite>

如果我们使用INSERT语句将5条记录插入其中-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> insert into CRICKETERS values('Shikhar', 'Dhawan', 33, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Jonathan', 'Trott', 38, 'CapeTown', 'SouthAfrica');
sqlite> insert into CRICKETERS values('Kumara', 'Sangakkara', 41, 'Matale', 'Srilanka');
sqlite> insert into CRICKETERS values('Virat', 'Kohli', 30, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Rohit', 'Sharma', 32, 'Nagpur', 'India');
sqlite>

以下SELECT语句检索年龄大于35的记录-
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * FROM CRICKETERS WHERE AGE > 35;
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   -----------
Jonathan     Trott        38     CapeTown     SouthAfrica
Kumara       Sangakkara   41     Matale       Srilanka
sqlite>

使用Python的子句

Cursor对象/类包含执行查询和获取数据等的所有方法。连接类的cursor方法返回一个光标对象。

因此,要使用python在SQLite数据库中创建表-
Therefore, to create a table in SQLite database using python −

使用connect()方法与数据库建立连接。
通过在上面创建的连接对象上调用cursor()方法来创建游标对象。
现在,使用Cursor类的execute()方法执行CREATE TABLE语句。

实例

下面的示例创建一个名为Employee的表并填充它。然后使用where子句检索年龄小于23的记录。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
# 删除已存在的表
cursor.execute("DROP TABLE if EXISTS EMPLOYEE")
sql = '''CREATE TABLE EMPLOYEE(
   FIRST_NAME CHAR(20) not NULL,
   LAST_NAME CHAR(20),
   AGE INT,
   SEX CHAR(1),
   INCOME FLOAT
)'''
cursor.execute(sql)
# 填充表
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Ramya', 'Rama priya', 27, 'F', 9000)''')
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Vinay', 'Battacharya', 20, 'M', 6000)''')
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Sharukh', 'Sheik', 25, 'M', 8300)''')
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Sarmista', 'Sharma', 26, 'F', 10000)''')
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Tripthi', 'Mishra', 24, 'F', 6000)''')
# 使用where子句检索特定记录
cursor.execute("SELECT * from EMPLOYEE WHERE AGE <23")
print(cursor.fetchall())
# 在数据库中提交更改
conn.commit()
# 关闭连接
conn.close()

运行结果:

 [('Vinay', 'Battacharya', 20, 'M', 6000.0)]

SQLite Order by

使用SELECT查询获取数据时,你将以插入记录的顺序获得记录。

你可以使用Order By子句按所需顺序(升序或降序)对结果进行排序。默认情况下,此子句以升序对结果进行排序,如果需要按降序排列它们,则需要显式使用“ DESC”。

语法

 SELECT column-list
from table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

Example

假设我们使用以下查询创建了一个名为CRICKETERS的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Age int,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255)
);
sqlite>

如果我们使用INSERT语句将5条记录插入其中-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> insert into CRICKETERS values('Shikhar', 'Dhawan', 33, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Jonathan', 'Trott', 38, 'CapeTown', 'SouthAfrica');
sqlite> insert into CRICKETERS values('Kumara', 'Sangakkara', 41, 'Matale', 'Srilanka');
sqlite> insert into CRICKETERS values('Virat', 'Kohli', 30, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Rohit', 'Sharma', 32, 'Nagpur', 'India');
sqlite>

以下SELECT语句按年龄的升序检索CRICKETERS表的行-
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * FROM CRICKETERS ORDER BY AGE;
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   -----------
Virat        Kohli        30     Delhi        India
Rohit        Sharma       32     Nagpur       India
Shikhar      Dhawan       33     Delhi        India
Jonathan     Trott        38     CapeTown     SouthAfrica
Kumara       Sangakkara   41     Matale       Srilanka
sqlite>

你可以使用多个列来对表的记录进行排序。以下SELECT语句根据AGE和FIRST_NAME列对CRICKETERS表的记录进行排序。
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * FROM CRICKETERS ORDER BY AGE, FIRST_NAME;
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   -------------
Virat        Kohli        30     Delhi        India
Rohit        Sharma       32     Nagpur       India
Shikhar      Dhawan       33     Delhi        India
Jonathan     Trott        38     CapeTown     SouthAfrica
Kumara       Sangakkara   41     Matale       Srilanka
sqlite>

默认情况下,ORDER BY子句将表的记录按升序排序,你可以使用DESC将结果按降序排列-
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * FROM CRICKETERS ORDER BY AGE DESC;
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   -------------
Kumara       Sangakkara   41     Matale       Srilanka
Jonathan     Trott        38     CapeTown     SouthAfrica
Shikhar      Dhawan       33     Delhi        India
Rohit        Sharma       32     Nagpur       India
Virat        Kohli        30     Delhi        India
sqlite>

使用Python的ORDER BY子句

要按特定顺序检索表的内容,请在游标对象上调用execute()方法,并将SELECT语句与ORDER BY子句一起作为参数传递给它。

实例

在以下示例中,我们将创建一个具有名称和Employee的表,填充该表,然后使用ORDER BY子句按其年龄的(升序)顺序检索其记录。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import psycopg2
# 建立连接
conn = psycopg2.connect(
   database="mydb", user='postgres', password='password', host='127.0.0.1', port= '5432'
)
conn.autocommit = True
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
#删除已存在的表
cursor.execute("DROP TABLE if EXISTS EMPLOYEE")
# 创建表
sql = '''CREATE TABLE EMPLOYEE(
   FIRST_NAME CHAR(20) not NULL,
   LAST_NAME CHAR(20),
   AGE INT, SEX CHAR(1),
   INCOME INT,
   CONTACT INT
)'''
cursor.execute(sql)
# 填充表
cursor.execute(
   '''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Ramya', 'Rama priya', 27, 'F', 9000),
   ('Vinay', 'Battacharya', 20, 'M', 6000),
   ('Sharukh', 'Sheik', 25, 'M', 8300),
   ('Sarmista', 'Sharma', 26, 'F', 10000),
   ('Tripthi', 'Mishra', 24, 'F', 6000)''')
conn.commit()
#Retrieving specific records using the ORDER BY clause
cursor.execute("SELECT * from EMPLOYEE ORDER BY AGE")
print(cursor.fetchall())
# 在数据库中提交更改
conn.commit()
# 关闭连接
conn.close()

输出结果:

 [
   ('Vinay', 'Battacharya', 20, 'M', 6000, None),
   ('Tripthi', 'Mishra', 24, 'F', 6000, None),
   ('Sharukh', 'Sheik', 25, 'M', 8300, None),
   ('Sarmista', 'Sharma', 26, 'F', 10000, None),
   ('Ramya', 'Rama priya', 27, 'F', 9000, None)
]

SQLite更新表

UPDATE对任何数据库的操作都意味着修改表中一个或多个记录的值,这些值已经在数据库中可用。你可以使用UPDATE语句更新SQLite中现有记录的值。

要更新特定的行,你需要与其一起使用WHERE子句。

语法

 UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

实例

假设我们使用以下查询创建了一个名为CRICKETERS的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Age int,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255)
);
sqlite>

如果我们使用INSERT语句将5条记录插入其中-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> insert into CRICKETERS values('Shikhar', 'Dhawan', 33, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Jonathan', 'Trott', 38, 'CapeTown', 'SouthAfrica');
sqlite> insert into CRICKETERS values('Kumara', 'Sangakkara', 41, 'Matale', 'Srilanka');
sqlite> insert into CRICKETERS values('Virat', 'Kohli', 30, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Rohit', 'Sharma', 32, 'Nagpur', 'India');
sqlite>

下面的语句修改的板球运动员,他的名字是年龄Shikhar的 -
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> UPDATE CRICKETERS SET AGE = 45 WHERE FIRST_NAME = 'Shikhar' ;
sqlite>

如果你检索FIRST_NAME是Shikhar的记录,则会观察到年龄值已更改为45-
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * FROM CRICKETERS WHERE FIRST_NAME = 'Shikhar';
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   --------
Shikhar      Dhawan       45     Delhi        India
sqlite>

如果你尚未使用WHERE子句,则所有记录的值都将更新。以下UPDATE语句使CRICKETERS表中的所有记录的寿命增加1-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> UPDATE CRICKETERS SET AGE = AGE+1;
sqlite>

如果使用SELECT命令检索表的内容,则可以看到更新后的值为-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * FROM CRICKETERS;
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   -------------
Shikhar      Dhawan       46     Delhi        India
Jonathan     Trott        39     CapeTown     SouthAfrica
Kumara       Sangakkara   42     Matale       Srilanka
Virat        Kohli        31     Delhi        India
Rohit        Sharma       33     Nagpur       India
sqlite>

使用Python更新现有记录

To add records to an existing table in SQLite database −

导入sqlite3包。
通过将数据库名称作为参数传递给它,使用connect()方法创建一个连接对象。
cursor()方法返回使用你可以与sqlite3的通信的光标对象。通过调用(上面创建的)Connection对象上的cursor()对象来创建光标对象。
然后,通过向游标对象传递UPDATE语句作为参数来调用execute()方法。

实例

在Python示例中,创建一个名为EMPLOYEE的表,向其中插入5条记录,并使所有男性雇员的年龄增加1-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
#删除已存在的表
cursor.execute("DROP TABLE if EXISTS EMPLOYEE")
# 按要求创建表
sql ='''CREATE TABLE EMPLOYEE(
   FIRST_NAME CHAR(20) not NULL,
   LAST_NAME CHAR(20),
   AGE INT,
   SEX CHAR(1),
   INCOME FLOAT
)'''
cursor.execute(sql)
# 插入数据
cursor.execute('''INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
VALUES ('Ramya', 'Rama priya', 27, 'F', 9000),
   ('Vinay', 'Battacharya', 20, 'M', 6000),
   ('Sharukh', 'Sheik', 25, 'M', 8300),
   ('Sarmista', 'Sharma', 26, 'F', 10000),
   ('Tripthi', 'Mishra', 24, 'F', 6000)''')
conn.commit()
# 正在获取更新前的所有行
print("Contents of the Employee table: ")
cursor.execute('''SELECT * from EMPLOYEE''')
print(cursor.fetchall())
# 更新记录
sql = '''UPDATE EMPLOYEE SET AGE=AGE+1 WHERE SEX = 'M' '''
cursor.execute(sql)
print("Table updated...... ")
# 正在获取更新后的所有行
print("Contents of the Employee table after the update operation: ")
cursor.execute('''SELECT * from EMPLOYEE''')
print(cursor.fetchall())
# 在数据库中提交更改
conn.commit()
# 关闭连接
conn.close()

输出结果:

 Contents of the Employee table:
[
   ('Ramya', 'Rama priya', 27, 'F', 9000.0),
   ('Vinay', 'Battacharya', 20, 'M', 6000.0),
   ('Sharukh', 'Sheik', 25, 'M', 8300.0),
   ('Sarmista', 'Sharma', 26, 'F', 10000.0),
   ('Tripthi', 'Mishra', 24, 'F', 6000.0)
]
Table updated......
Contents of the Employee table after the update operation:
[
   ('Ramya', 'Rama priya', 27, 'F', 9000.0),
   ('Vinay', 'Battacharya', 21, 'M', 6000.0),
   ('Sharukh', 'Sheik', 26, 'M', 8300.0),
   ('Sarmista', 'Sharma', 26, 'F', 10000.0),
   ('Tripthi', 'Mishra', 24, 'F', 6000.0)
]

SQLite删除数据

要从SQLite表中删除记录,你需要使用DELETE FROM语句。要删除特定记录,你需要与其一起使用WHERE子句。

语法

 DELETE from table_name [WHERE Clause]

例如:

假设我们使用以下查询创建了一个名为CRICKETERS的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Age int,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255)
);
sqlite>

如果我们使用INSERT语句将5条记录插入其中-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> insert into CRICKETERS values('Shikhar', 'Dhawan', 33, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Jonathan', 'Trott', 38, 'CapeTown', 'SouthAfrica');
sqlite> insert into CRICKETERS values('Kumara', 'Sangakkara', 41, 'Matale', 'Srilanka');
sqlite> insert into CRICKETERS values('Virat', 'Kohli', 30, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Rohit', 'Sharma', 32, 'Nagpur', 'India');
sqlite>

以下语句删除姓“ Sangakkara”的板球运动员的记录。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> DELETE from CRICKETERS WHERE LAST_NAME = 'Sangakkara';
sqlite>

如果使用SELECT语句检索表的内容,则由于我们已删除一条记录,因此只能看到4条记录。
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * FROM CRICKETERS;
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   --------
Shikhar      Dhawan       46     Delhi        India
Jonathan     Trott        39     CapeTown     SouthAfrica
Virat        Kohli        31     Delhi        India
Rohit        Sharma       33     Nagpur       India
sqlite>

如果执行不带WHERE子句的DELETE FROM语句,则将删除指定表中的所有记录。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> DELETE from CRICKETERS;
sqlite>

由于已删除所有记录,因此,如果尝试检索CRICKETERS表的内容,则使用SELECT语句,你将获得一个空结果集,如下所示-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * from CRICKETERS;
sqlite>

使用Python删除数据

要将记录添加到SQLite数据库中的现有表中-

导入sqlite3包。
通过将数据库名称作为参数传递给它,使用connect()方法创建一个连接对象。
cursor()方法返回使用你可以与sqlite3的通信的光标对象。通过调用(上面创建的)Connection对象上的cursor()对象来创建光标对象。
然后,通过将游标对象作为参数传递给DELETE语句,从而在游标对象上调用execute()方法。

实例

以下python示例从EMPLOYEE表中删除年龄值大于25的记录。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
# 检索表的内容
print("Contents of the table: ")
cursor.execute('''SELECT * from EMPLOYEE''')
print(cursor.fetchall())
# 删除记录
cursor.execute('''DELETE from EMPLOYEE WHERE AGE > 25''')
# 删除后检索数据
print("Contents of the table after delete operation ")
cursor.execute("SELECT * from EMPLOYEE")
print(cursor.fetchall())
# 在数据库中提交更改
conn.commit()
# 关闭连接
conn.close()

输出结果:

 Contents of the table:
[
   ('Ramya', 'Rama priya', 27, 'F', 9000.0),
   ('Vinay', 'Battacharya', 21, 'M', 6000.0),
   ('Sharukh', 'Sheik', 26, 'M', 8300.0),
   ('Sarmista', 'Sharma', 26, 'F', 10000.0),
   ('Tripthi', 'Mishra', 24, 'F', 6000.0)
]
Contents of the table after delete operation
[
   ('Vinay', 'Battacharya', 21, 'M', 6000.0),
   ('Tripthi', 'Mishra', 24, 'F', 6000.0)
]

SQLite删除表

你可以使用DROP TABLE语句删除整个表。你只需要指定要删除的表的名称即可。

语法

 DROP TABLE table_name;

实例

假设我们使用以下查询创建了两个名为CRICKETERS和EMPLOYEES的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255), Last_Name VARCHAR(255), Age int,
   Place_Of_Birth VARCHAR(255), Country VARCHAR(255)
);
sqlite> CREATE TABLE EMPLOYEE(
   FIRST_NAME CHAR(20) not NULL, LAST_NAME CHAR(20), AGE INT,
   SEX CHAR(1), INCOME FLOAT
);
sqlite>

现在,如果你使用.tables命令验证表列表,则可以在其中(列表)看到上面创建的表,如下所示:
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> .tables
CRICKETERS EMPLOYEE
sqlite>

以下语句从数据库中删除名为Employee的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> DROP table employee;
sqlite>

由于已删除Employee表,因此,如果再次检索表列表,则只能观察其中的一个表。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> .tables
CRICKETERS
sqlite>

如果你尝试再次删除Employee表,则由于已将其删除,你将收到一条错误消息,提示“无此类表”,如下所示-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> DROP table employee;
Error: no such table: employee
sqlite>

若要解决此问题,可以将IF EXISTS子句与DELETE语句一起使用。如果存在该表,则将其删除,否则将跳过DELETE操作。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> DROP table if EXISTS employee;
sqlite>

使用Python删除表

你可以在任何时候使用MYSQL的DROP语句删除表,但是在删除任何现有表时要非常小心,因为丢失的数据在删除表后将无法恢复。

实例

要使用python从SQLite3数据库中删除表,请在游标对象上调用execute()方法,并将drop语句作为参数传递给该对象。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
# 删除已存在的表
cursor.execute("DROP TABLE emp")
print("Table dropped... ")
# 在数据库中提交更改
conn.commit()
# 关闭连接
conn.close()

输出结果:

 Table dropped...

SQLite Limit

在获取记录时,如果你想通过特定数量限制它们,可以使用SQLite的LIMIT子句来实现。

语法

 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
SELECT column1, column2, columnN
from table_name
LIMIT [no of rows]

实例

假设我们使用以下查询创建了一个名为CRICKETERS的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Age int,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255)
);
sqlite>

如果我们使用INSERT语句将5条记录插入其中-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> insert into CRICKETERS values('Shikhar', 'Dhawan', 33, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Jonathan', 'Trott', 38, 'CapeTown', 'SouthAfrica');
sqlite> insert into CRICKETERS values('Kumara', 'Sangakkara', 41, 'Matale', 'Srilanka');
sqlite> insert into CRICKETERS values('Virat', 'Kohli', 30, 'Delhi', 'India');
sqlite> insert into CRICKETERS values('Rohit', 'Sharma', 32, 'Nagpur', 'India');
sqlite>

以下语句使用LIMIT子句检索Cricketers表的前3条记录-
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * FROM CRICKETERS LIMIT 3;
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   -------------
Shikhar      Dhawan       33     Delhi        India
Jonathan     Trott        38     CapeTown     SouthAfrica
Kumara       Sangakkara   41     Matale       Srilanka
sqlite>

如果你需要限制从第n记录(不是1开始记录ST),你可以这样做,使用带有LIMIT一起抵消。
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT * FROM CRICKETERS LIMIT 3 OFFSET 2;
First_Name   Last_Name    Age    Place_Of_B   Country
----------   ----------   ----   ----------   --------
Kumara       Sangakkara   41     Matale       Srilanka
Virat        Kohli        30     Delhi        India
Rohit        Sharma       32     Nagpur       India
sqlite>

Python LIMIT 用法

如果通过传递SELECT查询和LIMIT子句在游标对象上调用execute()方法,则可以检索所需数量的记录。

实例

以下python示例使用LIMIT子句检索EMPLOYEE表的前两个记录。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
# 检索单行
sql = '''SELECT * from EMPLOYEE LIMIT 3'''
# 执行查询
cursor.execute(sql)
# 获取数据
result = cursor.fetchall();
print(result)
# 在数据库中提交更改
conn.commit()
# 关闭连接
conn.close()

输出结果:

 [
   ('Ramya', 'Rama priya', 27, 'F', 9000.0),
   ('Vinay', 'Battacharya', 20, 'M', 6000.0),
   ('Sharukh', 'Sheik', 25, 'M', 8300.0)
]

SQLite join连接

将数据分为两个表后,可以使用联接从这两个表中获取组合记录。

实例

假设我们使用以下查询创建了一个名为CRICKETERS的表-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE CRICKETERS (
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Age int,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255)
);
sqlite>

让我们再创建一个表OdiStats,用于描述CRICKETERS表中每个球员的一日板球统计数据。
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> CREATE TABLE ODIStats (
   First_Name VARCHAR(255),
   Matches INT,
   Runs INT,
   AVG FLOAT,
   Centuries INT,
   HalfCenturies INT
);
sqlite>

以下语句检索结合这两个表中的值的数据-
 
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
sqlite> SELECT
   Cricketers.First_Name, Cricketers.Last_Name, Cricketers.Country,
   OdiStats.matches, OdiStats.runs, OdiStats.centuries, OdiStats.halfcenturies
   from Cricketers INNER JOIN OdiStats ON Cricketers.First_Name = OdiStats.First_Name;
First_Name  Last_Name   Country  Matches  Runs   Centuries   HalfCenturies
----------  ----------  -------  -------  ----   ---------   -------------- 
Shikhar     Dhawan      Indi     133      5518   17          27
Jonathan    Trott       Sout     68       2819   4           22
Kumara      Sangakkara  Sril     404      14234  25          93
Virat       Kohli       Indi     239      11520  43          54
Rohit       Sharma      Indi     218      8686   24          42
sqlite>

使用Python加入子句

以下SQLite示例,使用python演示了JOIN子句-
 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()
# 检索数据
sql = '''SELECT * from EMP INNER JOIN CONTACT ON EMP.CONTACT = CONTACT.ID'''
# 执行查询
cursor.execute(sql)
# 正在从表中获取第一行
result = cursor.fetchall();
print(result)
# 在数据库中提交更改
conn.commit()
# 关闭连接
conn.close()

运行结果:

 [
   ('Ramya', 'Rama priya', 27, 'F', 9000.0, 101, 101, 'Krishna@mymail.com', 'Hyderabad'),
   ('Vinay', 'Battacharya', 20, 'M', 6000.0, 102, 102,'Raja@mymail.com', 'Vishakhapatnam'),
   ('Sharukh', 'Sheik', 25, 'M', 8300.0, 103, 103, 'Krishna@mymail.com', 'Pune'),
   ('Sarmista', 'Sharma', 26, 'F', 10000.0, 104, 104, 'Raja@mymail.com', 'Mumbai')
]

SQLite游标

sqlite3.Cursor类是一个实例,你可以使用该实例调用执行SQLite语句的方法,从查询的结果集中获取数据。你可以使用Connection对象/类的cursor()方法创建Cursor对象。

实例

 # Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-15
import sqlite3
# 连接sqlite
conn = sqlite3.connect('example.db')
# 使用cursor()方法创建游标对象
cursor = conn.cursor()

方法

以下是Cursor类/对象提供的各种方法。
方法 描述
execute() 该例程执行一条SQL语句。可以对SQL语句进行参数化(即,使用占位符代替SQL文字)。psycopg2模块使用%s符号支持占位符 例如:cursor.execute("insert into people values (%s, %s)", (who, age))
executemany() 此例程针对序列sql中找到的所有参数序列或映射执行SQL命令。
fetchone() 此方法获取查询结果集的下一行,返回单个序列,如果没有更多数据可用,则返回None。
fetchmany() 该例程获取查询结果的下一组行,并返回一个列表。当没有更多行可用时,将返回一个空列表。该方法尝试获取由size参数指示的尽可能多的行。
fetchall() 该例程获取查询结果的所有(剩余)行,并返回一个列表。如果没有可用的行,则返回一个空列表。

属性

以下是Cursor类的属性-
方法 描述
arraySize
这是一个读/写属性,你可以设置fetchmany()方法返回的行数。
description
这是一个只读属性,它返回包含结果集中列说明的列表。
lastrowid
这是一个只读属性,如果表中有任何自动递增的列,它将返回在上一次INSERT或UPDATE操作中为该列生成的值。
rowcount
如果执行SELECT和UPDATE操作,则返回返回/更新的行数。
connection
此只读属性提供Cursor对象使用的SQLite数据库连接。