python操控MySQL储存

目录

 

数据库简介

一、 python连接MySQL数据库

二、  python创建一个MySQL表格

三、 插入数据

四、更新数据

五、  删除数据

六、查询数据


数据库简介

关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以关系型数据库中的数据的储存方式就是行列组成的表,每一列代表一个字段、每一行代表一条记录。

关系型数据库有多种,例如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')
```

猜你喜欢

转载自blog.csdn.net/longhaierwd/article/details/131821222