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数据库中没有表

pymysql 获取dataframe_sql

try:
    create_sqli = "create table hello (id int,name varchar(30));"
    print(cur.execute(create_sqli))
except Exception as e:
    print('创建数据表失败:',e)
else:
    print('创建数据表成功')

执行代码可能会出现以下报错

pymysql 获取dataframe_sql_02


解决方法

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 ##刷新权限列表

pymysql 获取dataframe_数据_03


备注:以上都设置完成之后,若还是无法连接,检查火墙状态是否开启,设为关闭状态。

运行上述代码后:

pymysql 获取dataframe_sql_04


数据库westos下出现了hello这个表

pymysql 获取dataframe_数据库_05

(2)在数据表中插入数据

插入一条数据

try:
     insert_sqli = "insert into hello values(3,'apple');"
     cur.execute(insert_sqli)
except Exception as e:
     print('插入数据失败:',e)
else:
 如果是插入数据,一定要提交数据 不然数据库中的数据表中找不到要插入的数据
	 conn.commit()
     print('插入数据成功')

pymysql 获取dataframe_sql_06


显示插入数据成功,但是查看westos.hello表中并不能查看到数据

pymysql 获取dataframe_sql_07

插入数据后一定要记得conn.commit()进行数据提交,否则数据库中找不到要插入的数据

pymysql 获取dataframe_数据_08


pymysql 获取dataframe_sql_09


插入多条数据

第一种方式

第一步还是要先连接数据库,参照以上

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('插入多条数据成功')

pymysql 获取dataframe_pymysql 获取dataframe_10


pymysql 获取dataframe_数据库_11


第二种方式:

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('插入多条数据成功')

pymysql 获取dataframe_pymysql 获取dataframe_12


pymysql 获取dataframe_数据库_13

查询数据库

此时westos.hello中的数据为:

pymysql 获取dataframe_pymysql 获取dataframe_14


默认不返回查询结果集 返回数据记录数

sqli = 'select name from hello where id =20'   ##寻找id=20的结果
result = cur.execute(sqli)
print(result)

pymysql 获取dataframe_sql_15

cur.execute(sqli)
a = cur.fetchone()
print(a)

pymysql 获取dataframe_sql_16


获取下一个查询结果集

cur.fetchone()

获取指定个数查询结果集

print(cur.fetchmany(4))

pymysql 获取dataframe_pymysql 获取dataframe_17


获取从指针所指位置往后的所有查询结果

info = cur.fetchall()
print(info)

注意:在这里的查询,也是根据指针的位置进行判定,当指针已经移动到该数据的最后一个时,再获取下一个查询结果,就会返回None,此时若想要继续查询,就需要移动游标指针。

pymysql 获取dataframe_pymysql 获取dataframe_18

移动游标指针

可以通过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

pymysql 获取dataframe_数据库_19

回游标之后的所有结果
print(cur.fetchmany(3))   
cur.scroll(-2,mode='relative')
print(cur.fetchmany(2))

pymysql 获取dataframe_sql_20