目录
数据库简介
关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以关系型数据库中的数据的储存方式就是行列组成的表,每一列代表一个字段、每一行代表一条记录。
关系型数据库有多种,例如SQLite,MySQL,Oracle,SQL Server, DB2等。
一、 python连接MySQL数据库
python连接数据库的示例:
```python
import pymysql
db = pymysql.connect(host='localhost',user='root',password='password',port=3306) #连接数据库
cursor = db.cursor() #获取操作游标
cursor.execute('SELECT VERSION()')
data = cursor.fetchone() #得到第一条数据
print('Database verison:',data)
cursor.execute('CREATE DATABASE spiders DEFAULT CHARACTER SET utf8mb4') #传入SQL语句,创建数据库
db.close() #关闭数据库
二、 python创建一个MySQL表格
创建一个表格:
db = pymysql.connect(host='localhost',user='root',password='password',port=3306) #连接数据库
cursor = db.cursor() #获取操作游标
cursor.execute('use spiders;')
sql = 'CREATE TABLE if NOT EXISTS students (id VARCHAR(225) NOT NULL,NAME VARCHAR(225) NOT NULL,age INT NOT NULL,PRIMARY KEY(id));'
cursor.execute(sql)
db.close() #关闭数据库
三、 插入数据
id = '20210001'
name = 'Bob'
age = 20
db = pymysql.connect(host='localhost',user='root',password='password',port=3306) #连接数据库
cursor = db.cursor() #获取操作游标
cursor.execute('use spiders;')
sql = 'INSERT INTO students(id,name,age) values (%s,%s,%s)'
try:
cursor.execute(sql,(id,name,age))
db.commit()#提交,做出修改
except:
print('error')
db.rollback()#回滚
db.close() #关闭数据库
需要commit(),mysql的提交,否则不会对表进行修改。
一般来说,上面的插入方法不灵活。python对数据库的插入可以传入一个动态子带你,让SQL语句根据这个字典构造出来,这是通用的插入方法。
data = {
'id': '20220003',
'name': 'Link',
'age':20
}
table = 'students'
keys = ','.join(data.keys())
values = ','.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table,keys=keys,values=values)
print(keys)
print(values)
print(sql)
得到输出:
id,name,age
%s,%s,%s
INSERT INTO students(id,name,age) VALUES (%s,%s,%s)
#则插入操作就可以这样写
data = {
'id': '20220003',
'name': 'Link',
'age':20
}
table = 'students'
keys = ','.join(data.keys())
values = ','.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table,keys=keys,values=values)
print(keys)
print(values)
print(sql)
db = pymysql.connect(host='localhost',user='root',password='password',port=3306) #连接数据库
cursor = db.cursor() #获取操作游标
cursor.execute('use spiders;')
try:
cursor.execute(sql,tuple(data.values()))
db.commit()#提交,做出修改
print('Successful')
except:
print('error')
db.rollback()#回滚
db.close() #关闭数据库
四、更新数据
同样使用字典构造SQL语句,并且使用一种去重方法——如果数据存在,就更新数据,如果数据不存在,则插入数据。示例如下:
data = {
'id': '20220015',
'name': 'Link',
'age':30
}
table = 'students'
keys = ','.join(data.keys())
values = ','.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE '.format(table=table,keys=keys,values=values)
updata = ','.join(["{key} = %s".format(key= key) for key in data.keys()])
print(updata)
sql += updata
print(keys)
print(values)
print(sql)
db = pymysql.connect(host='localhost',user='root',password='password',port=3306) #连接数据库
cursor = db.cursor() #获取操作游标
cursor.execute('use spiders;')
try:
cursor.execute(sql,tuple(data.values())*2) #因为有6个%s,则插入的元组需要翻倍
db.commit()#提交,做出修改
print('Successful')
except:
print('error')
db.rollback()#回滚
db.close() #关闭数据库
这样写的好处是,可以实现主键不存在便插入数据,主键存在则更新数据
五、 删除数据
删除数据直接使用DELETE语句即可。
示例:
table = 'students'
condition = 'age >= 25'
sql = 'DELETE FROM {table} WHERE {condition}'.format(table = table,condition = condition)
print(sql)
db = pymysql.connect(host='localhost',user='root',password='password',port=3306) #连接数据库
cursor = db.cursor() #获取操作游标
cursor.execute('use spiders;')
try:
cursor.execute(sql)
db.commit()#提交,做出修改
print('Delete successfully')
except:
print('error')
db.rollback()#回滚
db.close() #关闭数据库
六、查询数据
MySQL查询操作使用select语句,并且编写python代码时,不在需要使用提交函数commit(),可以调用rowcount属性得到返回结果的条数,使用fetchone()方法得到第一条记录,使用fetchall()方法得到所有的查询结果。
示例如下:
table = 'students'
conditions = 'age >= 20'
sql = 'SELECT * FROM {table} WHERE {conditions}'.format(table = table,conditions = conditions)
print(sql)
db = pymysql.connect(host='localhost',user='root',password='password',port=3306) #连接数据库
cursor = db.cursor() #获取操作游标
try:
cursor.execute('use spiders')
cursor.execute(sql) #传入SQL语句
print('Count: ', cursor.rowcount)
one = cursor.fetchone()
print('One:',one)
results = cursor.fetchall()
print('Results:',results)
print('Results type:', type(results))
for result in results:
print(result)
except:
print('Error')
这里fetchall方法并不会获得所有结果,因为之前的fetchone方法已经获得一个结果,导致游标下移,所有再次使用fetchall方法只能获得第一个之后的记录。
fetchall返回一个元组,导致占用的空间开销大,一般建议使用while循环语句和fetchone方法获取每条记录:
table = 'students'
conditions = 'age >= 20'
sql = 'SELECT * FROM {table} WHERE {conditions}'.format(table = table,conditions = conditions)
print(sql)
db = pymysql.connect(host='localhost',user='root',password='password',port=3306) #连接数据库
cursor = db.cursor() #获取操作游标
try:
cursor.execute('use spiders')
cursor.execute(sql) #传入SQL语句
print('Count: ', cursor.rowcount)
one = cursor.fetchone()
while one:
print('One:',one)
one = cursor.fetchone()
# results = cursor.fetchall()
# print('Results:',results)
# print('Results type:', type(results))
# for result in results:
# print(result)
except:
print('Error')
```