我的个人网站:https://www.gentlecp.com
本文仅就个人使用中常见的数据库使用方法进行介绍,内容简练,拒绝废话。
开源的嵌入式关系数据库,相较其他数据库安装运行非常方便,实现一个文件即数据库。
python2.5以上版本中自带sqlite3,只要安装了python直接就可以import sqlite3使用
其他的具体可参考此网站
创建数据库
CREATE DATABASE db_name
删除数据库
DROP DATABASE db_name
创建新表
CREATE TABLE table_name(
column1 [type] (PRIMARY KEY) (NOT NULL),
column2 [type],
....
注:用[]包围的意为多类型变量,实际使用需要用具体类型替换,用()包围的意为可有可无的语句,用{}包围的意为具体值
SQL语句不区分大小写,个人建议写代码的时候已有关键字采用大写,其他如表名,列名由自己编写的名称采用小写,直观便于区分理解。
下面是具体可选的type(数据类型)与对应含义
type | 含义 |
---|---|
INTEGER(size) INT(size) SMALLINT(size) TINYINT(size) |
整数类型,size代表最大的位数,也可以不写,有趣的是即便你存储位数超过你限定的位数,一般也会 正常显示,具体可以看看这篇文章 |
DECIMAL(size,d) NUMERIC(size,d) |
小数类型,size同整数类型,d为小数点右侧的最大位数 |
VARCHAR(size) | 可变长的字符串,即根据字符串实际大小分配长度(空间),一般字符串的用这个就行了 |
date(yyyymmdd) | 日期类型,形式为year+month+day |
修改表
ALTER TABLE table_name ADD column_name [type] #添加列
ALTER TABLE table_name ALTER COLUMN column_name [type] #修改某列数据类型
ALTER TABLE table_name DROP COLUMN column_name #删除表中某列
删除表
DROP TABLE table_name
查数据
SELECT * FROM table_name #获取某表中所有数据
SELECT (DISTINCT) column1,column2,... FROM table_name #查询某表中特定列的数据,DISTINCT用于去除表中重复值
SELECT column1,column2,... FROM table_name WHERE column [operator] {value} #带条件的查询,value若是字符串需加''
SELECT column1,column2,... FROM table_name WHERE
column1 [operator1] {value1} AND column2 [operator2] {value2} #多条件查询,AND可用OR替换
SELECT column1,column2,... FROM table_name
ORDER BY column1 (DESC), column2 (ASC) #排序,先按照column1降序排列,再按照column2升序排列
查询数据还有许多复杂的语句,但是没必要贪多,以上几条能熟练运用就可以了。
下面是具体可选的条件语句中的操作符[operator]
operator | 含义 |
---|---|
= | 等于 |
<> | 不等于,有些数据库可以用 != 但是建议统一用这个 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在此范围内搜索 |
LIKE | 按某种模式搜索,用法可参考此文章 |
插入数据
INSERT INTO table_name(column1,column2,...) VALUES({value1},{value2},...) #往特定表的特定列中插入数据
实际代码中编写插入数据的时候{value}一般用%s替代,代表可变的数据,进行excute执行SQL语句操作的时候将数据作为参数传入。
更新数据
UPDATE table_name SET column1 = {value1} WHERE column2 = {value2}
#修改指定表column2的值为value2的column1的值为value1,好绕口- -|||
删除数据
DELETE FROM table_name WHERE column = {value} #删除指定表中column值为value的单条数据
创建数据库
import sqlite3
#创建数据库
con = sqlite3.connect('test.db') #在硬盘上创建数据库,生成.db文件
#con = sqlite3.connect(':memory') #在内存中创建临时数据库,程序结束后自动销毁
cur = con.cursor() #游标对象,用于支持sql语句的执行以及记录的获取
建表
SQL_CREATE_TABLE = '''
CREATE TABLE person(
id INTEGER PRIMARY KEY NOT NULL,
name VARCHAR(30),
age INT(4)
)
''' #SQL语句的编写建议像这样分行,增强可读性
cur.execute(SQL_CREATE_TABLE)
插入数据
data_single = (1,"GentleCP",100)
SQL_INSERT_DATA = '''
INSERT INTO person(id,name,age)
VALUES(?,?,?)
''' #注意这里我采用了占位符,这种方式能够规避SQL注入,建议统一
cur.execute(SQL_INSERT_DATA, data_single)
try:
con.commit() #插入数据后只是在缓冲区,需要提交事务才能写到数据库
except:
con.rollback() #如果提交失败,则回滚之前的插入操作
data_multiple = [
(2,"HappyCP",10),
(3,"SadCP",28),
]
cur.executemany(SQL_INSERT_DATA, data_multiple)
try:
con.commit() #插入数据后只是在缓冲区,需要提交事务才能写到数据库
except:
con.rollback() #如果提交失败,则回滚之前的插入操作
查询数据
SQL_QUERY = '''
SELECT * FROM person
'''
cur.execute(SQL_QUERY)
res = cur.fetchall() #光查询还看不到数据,需要用游标的fetch方法获取
#res = cur.fetchone() #获取一条
#res = cur.fetchmany(5) #获取多条
print('查询所有数据:'+ str(res))
#带条件的查询
SQL_QUERY_CON = '''
SELECT name FROM person WHERE id=2
'''
cur.execute(SQL_QUERY_CON)
res = cur.fetchone()
print('带条件的查询:'+ str(res))
SQL_MODIFY = '''
UPDATE person SET name=? WHERE id=?
'''
SQL_DELETE = '''
DELETE FROM person WHERE id=?
'''
cur.execute(SQL_MODIFY,('BeautifulCP',1))
cur.execute(SQL_DELETE,(3,)) #注意传入得是元组
try:
con.commit()
except:
con.rollback()
cur.execute(SQL_QUERY)
res = cur.fetchall()
print('修改,删除后的数据:'+ str(res))
con.close() #全部操作执行完毕后关闭数据库连接
对于sqlite数据库常用的操作如上所示,还有一些其他的上文提到的SQL语句,可自行尝试。
MySQL是关系型数据库,关联数据库将数据库存储在表中。
ubantu
打开终端(Terminal),输入如下命令
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
安装过程中需要根据提示设置账号密码(密码不要忘!!!),安装完成后运行如下命令检验安装是否成功:
sudo netstat -tap | grep mysql
如果看到mysql的socket处于listen状态表示安装成功。
Windows
Windows下安装mysql比较麻烦,这里提供傻瓜式安装教程
MySQL数据类型
数据类型大类 | 数据类型 | 含义 | 简单理解 |
字符串 | CHAR(size) | 固定长度,最多255个字符 | 很短的字符用它,如姓名 |
VARCHAR(size) | 可变长度,最多255个字符,超过了会自动转成TEXT | 节省空间 | |
TINTTEXT | 可变长度,最多255个字符 | 效果同CHAR,TEXT与CHAR傻傻分不清? | |
TEXT | 可变长度,最多65535个字符 | 存较大量文字信息 | |
MEDIUMTEXT | 可变长度,最多2^24-1个字符 | 比前者更大 | |
LONGTEXT | 可变长度,最多2^32-1个字符 | 比前者更大 | |
整数 | TINYINT(size) | 1个字节,存储数字范围(-128~127) | 很短的字符用它,如姓名 |
SMALLINT(size) | 2个字节,存储数字范围(-32768~32767) | 存大一丢丢的数字,例如你的工资:) | |
MEDIUMINT(size) | 3个字节,存储数字范围(-8388608~8388607) | 存稍大的数字,例如你努力十年后的工资:) | |
INT(size) | 4个字节,存储数字范围(-2147483648~2147483647) | 存极大的数字,例如你梦想的工资:) | |
BIGINT(size) | 8个字节,存储数字范围( -2^63~2^63-1) | 存天文数字,例如马云的工资:) | |
二进制数据 | TINYBLOB(size) | 0~255个字符 | 同字符串类,但是存储的是二进制数据 |
BLOB(size) | 0~65535个字符 | ||
MEDIUMBLOB(size) | 0-2^24个字符 | ||
LONGBLOB(size) | 0~2^32个字符 | ||
时间 | DATE | yyyy-mm-dd | 不用解释了吧:) |
TIME | hh:mm:ss | ||
DATETIME | yyyy-mm-dd hh:mm:ss[.fraction] | ||
TIMESTAMP | yyyy-mm-dd hh:mm:ss[.fraction],范围限制在 1970-01-01 00:00:01.000000 到 2038-01-19 03:14:07.999999 |
MySQL的DDL与DML与sqlite大同小异,在此不一一列举,后续会在具体代码中说明介绍。
1. 连接数据库
mysql -u [user_name] -p [password] #连接本地数据库
mysql-h [host_ip] -u [user_name] -p [password] #连接远程数据库
2.修改密码
mysqladmin -u [user_name] -p [old_pwd] -password [new_pwd]
注:以上操作需在C:\Program Files\MySQL\MySQL Server 8.0\bin目录控制台下输入操作,或将该路径添加到环境变量path中
更多控制台对于MySQL的详细操作,可以看这里
附:一般我们对于MySQL的常规操作可以通过可视化工具代替实现,此处推荐使用navicat,包含了对sqlite,MySQL等一系列数据库的可视化。
python有许多操作MySQL的模块,个人推荐使用pymysql,安装只需用pip在终端或控制台输入如下命令:
pip install pymysql
在需要对MySQL数据库操作的时候导入该模块即可。
创建,连接数据库
import pymysql
conn = pymysql.connect(
host="localhost",
user="root",
passwd="root",
database="test",
charset="UTF8")
cur = conn.cursor()
其他操作与sqlite3基本一致,不过注意pymysql中占位符是%s
MongoDB介于关系型数据库与非关系型数据库之间,他的存储更类似于一种文件的形式。MongoDB将关系型数据库中的表转换成了集合(Collections的形式),相比于MySQL等关系型数据库,它更加自由,你无需像创建表,一个个定义字段,然后用sql语句进入增删查改。每一条存储在MongoDB中的数据采用键值对的形式,所以,我们插入一条MongoDB数据需是json格式。
windows
windows中安装MongoDB较复杂,网上有许多安装教程,这里给出一个作为参考。
Linux
sudo apt-get install mongodb # ubantu
yum install mongodb # centos
linux中会自动创建一个/data/db目录,作为dbpath的目录。
输入mongo,即可进入mongodb交互界面
[外链图片转存失败(img-acwPb7kb-1563946716193)(http://note.youdao.com/yws/res/11274/7C60156389A14D6DB229271270071B5D)]
以下为一些交互常用命令:
show dbs # 显示所有数据库,同MySQL show databases;
use db_name # 使用该数据库,同MySQL use db_name;
mac os
mac中需要先安装homebrew,利用brew命令安装mongodb
brew install mongodb
brew services start mongodb # 启动mongodb服务
其余操作同linux
安装完成MongoDB后,下面是如何使用编程语言操作mongodb,这里介绍python对mongodb的操作步骤。
pip install pymongo
安装完pymongo包后就可进行对mongodb的操作了。以下为一些常用操作:
连接到客户端
import pymongo
client = pymongo.MongoClient() # 连接到默认mongo客户端,默认是localhost,27017
# client = pymongo.MongoClient('107.109.12.1',9000) # 指定主机和端口连接
创建、连接数据库
db = client['test_db'] # 创建数据库,若存在则连接
# db = client.test_db 也可以用这种形式
获取集合
collection1 = db['collection1'] # 创建&获取集合
# collection1 = db.collection1 # 也可以用这种形式
插入数据
在python中一个字典对象为一条数据
data = {'name':'cp','age':1}
collection1.insert_one(data) # 插入一条数据
可以看到mongodb会自动给插入的数据对象赋一个_id属性,自动识别值的数据类型。因此同样的数据在mongodb看来是不一样的,多次插入同一条数据会被赋值不同的id存储。
datas = [
{'name':'cp','age':2},
{'name':'dd','age':3},
{'gender':'xx'}
]
collection1.insert_many(datas) # 插入多条,需用列表包裹
# collection1.insert(datas) # insert方法已经被弃用了,建议用insert_many
查找数据
查找数据需要提供数据的至少一个键与值作为查找标准(若有多个满足返回第一个),返回是json的形式。
# 查找单个数据
print(collection1.find_one({'name':'cp'}))
print(collection1.find_one({'age':1}))
print(collection1.find_one({'age':99}))
for res in collection1.find({'name':'cp'}): # find方法返回一个cursor游标,是可迭代对象
print(res)
计数
有时候我们指向知道集合中有多少数据满足条件,则可根据条件进行计数。
print(collection1.count_documents({})) # 查询集合数据总数
print(collection1.count_documents({'name':'cp'})) # 查询集合name为cp的数据总数
范围查询
满足更加复杂的查询条件。
# 查找所有年龄大于2的数据并按name排列
for res in collection1.find({'age':{'$gt':2}}).sort('name'):
print(res)
索引
之前说mongo对同样的数据看作不一样,是因为它会自动给数据添加id属性,每个id属性唯一区分一条数据,我们也可以手动添加索引,来避免重复数据的添加。同时索引也有利于我们进行数据的查找。
collection1.create_index([('user_id', pymongo.ASCENDING)],unique = True) # 创建索引,升序排列,降序是pymongo.DESCENDING
print(sorted(list(collection1.index_information()))) # 查看索引信息
data1 = {'user_id':3,'name':'hahah','age':100}
data2 = {'user_id':3,'name':'jjj','age':113}
collection1.insert_one(data1)
collection1.insert_one(data2)
当创建的索引文档已经存在时,再次插入会报异常。
修改数据
修改数据传入两个参数,第一个参数用于找到指定数据,第二个用于修改该数据
collection1.update_one({'name':'cp'},{'$set':{'age':100}}) # 修改的json参数第一个为$set后面接一个字典传入键值
collection1.update_many({'name':'cp'},{'$set':{'age':100}}) # 找到多条满足条件的均修改
删除数据
collection1.delete_one({'name':'cp'}) # 删除一条名为cp的数据
collection1.delete_many({'name':'cp'}) # 删除所有名为cp的数据