1.导入数据库模块
import pymysql
2.连接数据库(所需信息:host user passwd charset)
==如果从数据库中获取的信息是乱码的话,使用UTF-8进行转码。
conn = pymysql.connect(host='localhost', ##主机名
user='root', ##mysql用户
password='redhat', ##密码
db='westos', ##westos数据库
charset='utf8' ##字符显示方式
)
3.创建游标对象
cur = conn.cursor()
4.对数据库进行操作
(1)创建数据表
创建数据表的前提是对应的数据库已经建立
还没有执行以下代码时,westos数据库中没有表
try:
create_sqli = "create table hello (id int,name varchar(30));"
print(cur.execute(create_sqli))
except Exception as e:
print('创建数据表失败:',e)
else:
print('创建数据表成功')
执行代码可能会出现以下报错
解决方法
vim /etc/my.cnf ##检测是否设置为只允许本地连接(skip-networking=1)
systemctl restart mariadb
因为是以kiosk的用户身份运行的pycharm,所以要对kiosk进行所有权限的授予
mysql -uroot -predhat ##登录数据库
grant all on westos.* to kiosk@localhost ##给kiosk赋予所有权限
flush privileages ##刷新权限列表
备注:以上都设置完成之后,若还是无法连接,检查火墙状态是否开启,设为关闭状态。
运行上述代码后:
数据库westos下出现了hello这个表
(2)在数据表中插入数据
插入一条数据
try:
insert_sqli = "insert into hello values(3,'apple');"
cur.execute(insert_sqli)
except Exception as e:
print('插入数据失败:',e)
else:
如果是插入数据,一定要提交数据 不然数据库中的数据表中找不到要插入的数据
conn.commit()
print('插入数据成功')
显示插入数据成功,但是查看westos.hello表中并不能查看到数据
插入数据后一定要记得conn.commit()
进行数据提交,否则数据库中找不到要插入的数据
插入多条数据
第一种方式
第一步还是要先连接数据库,参照以上
try:
info = [(i,i) for i in range(100,1000)]
insert_sqli = "insert into hello values(%d,'%s');"
----------------------------------------------
for item in info:
print('insert语句:',insert_sqli %item)
cur.execute(insert_sqli %item)
-----------------------------------------------
except Exception as e:
print('插入多条数据失败:',e)
else:
print('插入多条数据成功')
第二种方式:
try:
info = [(i,i) for i in range(100,1000)]
insert_sqli = "insert into hello values('%s','%s');"
-------------------------------------
cur.executemany(insert_sqli,info)
--------------------------------------
except Exception as e:
print('插入多条数据失败:',e)
else:
print('插入多条数据成功')
查询数据库
此时westos.hello中的数据为:
默认不返回查询结果集 返回数据记录数
sqli = 'select name from hello where id =20' ##寻找id=20的结果
result = cur.execute(sqli)
print(result)
cur.execute(sqli)
a = cur.fetchone()
print(a)
获取下一个查询结果集
cur.fetchone()
获取指定个数查询结果集
print(cur.fetchmany(4))
获取从指针所指位置往后的所有查询结果
info = cur.fetchall()
print(info)
注意:在这里的查询,也是根据指针的位置进行判定,当指针已经移动到该数据的最后一个时,再获取下一个查询结果,就会返回None
,此时若想要继续查询,就需要移动游标指针。
移动游标指针
可以通过cursor.scroll(position, mode=“relative | absolute”)方法,来设置相对位置游标和绝对位置游标
当mode=‘absolute’时,代表绝对移动,
value就代表移动的绝对位置,value=0就代表移动到位置0处,
就是结果集开头,
value=3就是移动到位置3处,也就是第4条记录处
mode缺省值为’relative’,代表相对移
当mode='relative’时,value就是移动的长度,
value>0向后移动(从位置0移动到位置2),
value<0向前移动(比如从位置2移动到位置0)
sqli = 'select * from hello;'
cur.execute(sqli)
print(cur.fetchmany(3)) ##获取3个查询结果集
# print('正在移动指针到最开始的地方....')
返回到要最开始的地方
print(cur.fetchmany(5))
print(cur.fetchone())
—————————————————————— ##已经将ID=20的所对应的结果都获取完毕,指针到末尾位置,此时获取下一个结果就是`cur.fetchone()`就是`None`
cur.scroll(0,'absolute') ##让指针返回到最开始的地方
print(cur.fetchone()) ##此时再次获取,获取到20
回游标之后的所有结果
print(cur.fetchmany(3))
cur.scroll(-2,mode='relative')
print(cur.fetchmany(2))