MySQL数据库

MySQL数据库

主要使用PyMySQL库来操作MYSQL数据库

import pymysql

#通过PyMYSQL的connect()方法声明一个MYSQL连接对象db
db = pymysql.connect(host="127.0.0.1",user = 'root', password = "12345678",port = 3306)
#调用cursor()方法获得MYSQL的操作游标,利用游标来执行sql语句 
cursor = db.cursor()
#直接调用execute()来执行sql语句,查询MYSQL版本
cursor.execute('select version()')
#调用fetchone()方法获取第一条数据
data = cursor.fetchone()
print("DataBase version :",data)
#创建spiders数据库
#cursor.execute('create database spiders default character set utf8')
#使用spiders数据库
cursor.execute('use spiders')
#创建数据表students
sql = '''create table if not exists students (
    id varchar(255) not null,
    name varchar(255) not null,
    age int not null,
    primary key(id)
)
'''
#cursor.execute(sql)

#向students数据表插入数据
#第一种方法
id ="151241"
name = "fz"
age = 23
sql = "insert into students(id,name,age)values(%s,%s,%s)"
try:
    cursor.execute(sql,(id,name,age))
    db.commit()
except:
    db.rollback()

这里首先构造了一个SQL语句,其vaue值没有用字符串拼接的方式来构造,如:
sql=‘INSERT INTO students(id, name, age) values(’+ id +’,’ +name +’,’+ age + ‘)’
这样的写法烦琐而且不直观,所以我们选择直接用格式化符‰s来实现。有几个Value写几个%s,我们只需要在execute()方法的第一个参数传入该SQL语句, Value值用统一的元组传过来就好了。
这样的写法既可以避免字符串拼接的麻烦,又可以避免引号冲突的问题。

#第二种方法(通用方法)
 
data = {
     'id': "121242",
     'name': "hk",
     'age':23
 }
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)
try:
    if cursor.execute(sql,tuple(data.values())):
        print("Successful")
        db.commit()
except:
    print("Failed")
    db.rollback()

首先,需要构造插入的字段id、name和age。这里只需要将data的键名拿过来,然后用逗号分隔即可。所以’,‘jin(data.keys())的结果就是id,name,age,然后需要构造多个%当作占位符,有几个字段构造几个即可。比如,这里有三个字段,就需要构造%,‰,‰。这里首先定义了长度为1的数组[%s],然后用乘法将其扩充为[‰s’,"%s’,%5’],再调用join()方法,最终变成%5,%s,‰。最后,我们再利用字符串的 format(方法将表名、字段名和占位符构造出来。最终的SQL语句就被动态构造成了:
INSERT INTO students(id, name, age) VALUES(%6S, %s, %s)
最后,为 execute()方法的第一个参数传入5q1变量,第二个参数传人data的键值构造的元组,就可以成功插入数据了

## 更新数据
#最简单的方式
sql = "update students set age = %s where name = %s"
try:
    if cursor.execute(sql,(25,'fz')):
        db.commit()
        print("Successful")
except:
    db.rollback()
    print("Failed")

# #动态去重的方式
data = {
     'id': "121242",
     'name': "hk",
     'age':21
}

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)
update = ','join(["%s".format(key=key) for key = in data])
sql += update
try:
    if cursor.execute(sql,tuple(data.values())*2):
        print("Successful")
        db.commit()
except:
    print('Failed')
    db.commit()

## 删除数据
condition = "age > 20"
sql = "delete from {table} where {condition}".format(table=table,condition=condition)
try:
    cursor.execute(sql)
    db.commit()
except:
    db.rollback()

## 查询数据

sql = "select * from students "
try:
    cursor.execute(sql)
    print("Count:",cursor.rowcount)
    print("One:",cursor.fetchone())
    results = cursor.fetchall()
    print('Result:',results)
    print('Result Type',type(results))
    for row in results:
        print(row)
    
except:
    print("error")

但是这里需要注意一个问题,这里显示的是3条数据而不是4条, fetch11()方法不是获取所有
数据吗?这是因为它的内部实现有一个偏移指针用来指向査询结果,最开始偏移指针指向第一条数据,取一次之后,指针偏移到下一条数据,这样再取的话,就会取到下一条数据了。我们最初调用了一次 fenchone()方法,这样结果的偏移指针就指向下一条数据, fetch11()方法返回的是偏移指针指向的数据一直到结束的所有数据,所以该方法获取的结果就只剩3个了。
此外,我们还可以用 While循环加 fenchone()方法来获取所有数据,而不是用 fetch1l()全部 起获取出来。 fetch11()会将结果以元组形式全部返回,如果数据量很大,那么占用的开销会非常高。
因此,推荐使用如下方法来逐条取数据:’’’

try:
    cursor.execute(sql)
    row = cursor.fetchone()
    while row:
        print('Row:',row)
        row = cursor.fetchone()

except:
    print("error")

你可能感兴趣的:(python)