Python操作数据库

Python操作数据库

mysql

远程连接mysql(mariadb)数据库服务器进行开发:

1.下载mariadb-server:yum install mariadb-server -y

2.设定用户密码(安全初始化):mysql_secure_installation

3.查看网络端口(0.0.0.0:3306)是否开启:netstat -antuple | grep mysql

4.在防火墙中添加mariadb服务并重启firewalld服务

firewall-cmd --list-all
firewall-cmd --permanent --add-service=mysql
firewall-cmd --reload

5.在mariadb软件的mysql中设定可以访问的ip并重启服务:

mysql -uroot -predhat
	SHOW DATABASES;
	USE mysql;
	SELECT user,host FROM user;
	UPDATE user set host="%" WHERE host="localhost";
	SELECT user,host FROM user;
systemctl restart mysql

6.python程序

import pymysql   # 导入mysql数据库模块

# 1.连接数据库 host远程登陆的主机 user登陆mysql所使用的账户 passwd账户相应的密码 db登陆的数据库名 port数据库管理软件(mysql)的对外网络端口 charset字符编码格式
conn = pymysql.connect(host='172.25.254.1',   # 172.25.254.1/24 不对
                       user='root',
                       password='redhat',
                       db='test',       # 事先在mysql中新建数据库test
                       port=3306,
                       charset='utf8'
)

# 2.创建游标对象  我们使用游标对象来对数据库进行操作
cur = conn.cursor()

# 3.对数据库进行操作
# 创建数据表
try:
    create_sqli = "create table hello (id int,name varchar(30));"
    print(cur.execute(create_sqli))   # exexute方法,操作成功后返回0
except Exception as e:
    print('创建数据表失败:',e)
else:
    print('创建数据表成功')

当我们创建成功该数据表后,再次运行该程序,就会创建失败

在这里插入图片描述
在这里插入图片描述
对本机数据库的python开发:
在本机(mysql数据库服务器)上进行开发,只需要完成上面远程开发的1,2,3三步准备工作

import pymysql

# 1.连接数据库 host user passwd db charset
conn = pymysql.connect(host='localhost',   # 本地登陆
                       user='root',
                       password='redhat',
                       db='test',       # 事先在mysql中新建数据库test
                       charset='utf8'
)

# 2.创建游标对象
cur = conn.cursor()

# 3.对数据库进行操作
# 创建数据表
try:
    create_sqli = "create table world (id int,name varchar(30));"
    print(cur.execute(create_sqli))
except Exception as e:
    print('创建数据表失败:',e)
else:
    print('创建数据表成功')

在这里插入图片描述
在这里插入图片描述
以上的分别是连接远程数据库以及本地数据库进行开发的操作
而对于数据库的操作,当然不止是上面的创建数据表

向数据表中插入数据:

插入单条数据的两种方式:
手动:conn.commit()
自动:autocommit=‘True’

方式一:

import pymysql

# 1.连接数据库
conn = pymysql.connect(host='172.25.254.1',
                       user='root',
                       password='redhat',
                       db='test',
                       port=3306,
                       charset='utf8'
)

# 2.创建游标对象
cur = conn.cursor()

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

------------------------------------------------------------------
方式二:

import pymysql

# 1.连接数据库
conn = pymysql.connect(host='172.25.254.1',
                       user='root',
                       password='redhat',
                       db='test',
                       port=3306,
                       charset='utf8',
                       autocommit='True'   # 插入数据自动提交
)

# 2.创建游标对象
cur = conn.cursor()

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

在这里插入图片描述
在这里插入图片描述
插入多条数据的两种方式:

1.
# 第一种方式
insert_sqli = "insert into hello values(%d,'%s');"
for item in info:
    print('insert语句:',insert_sqli %item)   #这里的item是用于标准输入%d %s的
    cur.execute(insert_sqli %item)
2.
# 第二种方式
insert_sqli = "insert into hello values('%s','%s');"
    cur.executemany(insert_sqli,info)   # 直接使用已有的方法插入多条数据

两种方式,使用的游标对象的方法不同

-------------------------------------------------------------------
具体示例:

方式一:

import pymysql

# 1.连接数据库
conn = pymysql.connect(host='172.25.254.1',
                       user='root',
                       password='redhat',
                       db='test',
                       port=3306,
                       charset='utf8',
                       autocommit='True'
)

# 2.创建游标对象
cur = conn.cursor()

# 3.对数据库进行操作
# 插入多条数据
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('插入多条数据成功')


方式二:

import pymysql

# 1.连接数据库
conn = pymysql.connect(host='172.25.254.1',
                       user='root',
                       password='redhat',
                       db='test',
                       port=3306,
                       charset='utf8',
                       autocommit='True'
)

# 2.创建游标对象
cur = conn.cursor()

# 3.对数据库进行操作
# 插入多条数据
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('插入多条数据成功')

上面的两种方式,仅在try代码块内部列表生成式后面的部分不同

插入数据表,是以元组的方式插入的
第二种方式,插入多条数据,该方式较常见

在这里插入图片描述
在这里插入图片描述
数据库数据查询:

sqli = 'select name from hello where id =100'   # 查询(显示)数据表hello中id为100的记录的name项的值
result = cur.execute(sqli)  #不会返回查询的结果集,而是返回查询到的结果的个数

查询结果显示:
	单条记录显示:
		sqli = 'select name from hello where id =100'		
		cur.execute(sqli)
		a = cur.fetchone()  # 该语句必须在上一条语句执行后才能执行,否则会报错
		print(a)
	多条记录显示:
		print(cur.fetchmany(4)) #获取指定个数查询结果集,不传入个数则默认为1
		info = cur.fetchall()   #显示所有的查询结果(从游标往后的所有结果)
		 
------------------------------------------------------------------
具体示例:

import pymysql

# 1.连接数据库 host user passwd charset
conn = pymysql.connect(host='172.25.254.1',
                       user='root',
                       password='redhat',
                       db='test',
                       charset='utf8',
                       autocommit='True'
)

# 2.创建游标对象
cur = conn.cursor()

# 3.对数据库进行操作
# 查询数据库
sqli = 'select name from hello where id =100'
result = cur.execute(sqli)  # 默认不返回查询结果集 返回数据记录数
print('查询结果数',result)
print('----------分割线----------')
a = cur.fetchone()
print(a)
print('----------分割线----------')
print(cur.fetchone()) # 获取下一个查询结果集(当前游标指针的下一个匹配到的结果记录)
print('----------分割线----------')
print(cur.fetchmany(3)) # 获取指定个数查询结果集
print('----------分割线----------')
info = cur.fetchall()
print(info)

在这里插入图片描述
移动游标指针:

这里的游标对象(游标指针),就相当于是之前的文件操作中的文件指针

可以通过cursor.scroll(value, mode="relative | absolute")方法,
来设置相对位置游标和绝对位置游标
# 当mode='absolute'时,代表绝对移动,
# value就代表移动的绝对位置,value=0就代表移动到位置0处,就是结果集开头
# value=3就是移动到位置3处,也就是第4条记录处

mode缺省值为'relative',代表相对位移
value>0向后移动(从位置0移动到位置2),
value<0向前移动(比如从位置2移动到位置0------------------------------------------------------------

具体说明:

cur.scroll(0,'absolute')        
cur.scroll(-2,mode='relative')

第一个参数是移动量,大于0向后移动,小于0向前移动
第二个参数是基准位置,分为:
	absolute绝对位置:从文件开头开始移动
	relative相对位置:从当前位置开始移动
-----------------------------------------------------------------

具体示例:

import pymysql

# 1.连接数据库 host user passwd charset
conn = pymysql.connect(host='172.25.254.1',
                       user='root',
                       password='redhat',
                       db='test',
                       charset='utf8',
                       autocommit='True'
)

# 2.创建游标对象
cur = conn.cursor()

# 3.对数据库进行操作
# 移动游标指针
sqli = 'select * from hello;'  # 查询数据表hello中的所有数据记录
cur.execute(sqli)
print(cur.fetchmany(3))
print('----------分割线----------')
print('正在移动指针到最开始的地方....')
cur.scroll(0,'absolute')
print(cur.fetchmany(3))
print('----------分割线----------')
cur.scroll(0,'absolute')
print(cur.fetchall()) #返回游标之后的所有结果
print('----------分割线----------')
cur.scroll(-2,mode='relative')   # 回到了倒数第二条记录的位置,因此下面只能查询到两条记录就到结果集结尾了
print(cur.fetchmany(3))

在这里插入图片描述

redis

数据库总体分为两大类: sql,nosql

sql关系型数据库

在企业中,nosql用的比较多

redis这种nosql结构的数据库,工作在内存中,可以将没有关联的数据存放在一起
一般用作硬件数据库的缓冲

redis的搭建部署:

su
tar zxf '/home/kiosk/Desktop/redis-5.0.3.tar.gz' #解压到家目录去了
chmod 777 '/home/kiosk/redis-5.0.3' 
yum install gcc -y    # 安装gcc编译器,用来在下面的make命令中,编译源码
cd redis-5.0.3
ls
make
make install
pwd
cd utils
ls
./install_server.sh   执行该脚本来启动(安装)redis  (启动也是这个脚本,安装也是这个脚本)
(安装选项均使用回车选择默认项)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装完成后,redis的使用的端口6379使用的(开放的)默认是回环接口127.0.0.1,只能计算机本机访问到
因此需要在其配置文件中更改:

netstat -tnlp  # 查看开放的端口
vim /etc/redis/6379.conf  # 修改配置文件第70行由127.0.0.1更改为 bind 0.0.0.0
/etc/init.d/redis_6379 restart # 重启redis
netstat -tnlp  # 再次查看端口

在这里插入图片描述
进入redis:

redis-cli
	set name dd (命令(插入) 键 值)
	get name  (获取name键相对应的值)
	del name  (删除name键值对)
exit 退出

在这里插入图片描述
以上均为在shell中搭建以及使用redis的操作

Python中对redis进行操作:

以上部署即可支持python对本机上的redis进行操作了。
但是,笔者是以虚拟机作为服务器,安装了mysql和redis。
因此想要远程连接redis服务器,还需要在服务器上设置火墙允许访问redis所绑定的端口

import time
import redis   # 要去下载redis第三方模块

conn=redis.Redis()   # 打开(连接)redis Redis方法不传入参数,默认连接本地redis
conn.set('name','redhat',3) # 插入数据(键值对),键name,值westos,在内存中保存3秒,若不指定,应该是一直保存
print(conn.get('name')) # 输出在redis中查询键name的结果  输出:b'redhat'  b代表这是以二进制bit类型存储的,值为字符串redhat  
print('等待3s...') 
time.sleep(3)      # time模块函数sleep,休眠3秒
print(conn.get('name'))  # 再次查询,内存中没有了相应的数据  输出:None

--------------------------------------------------------------

指定传入参数连接redis的方式:  

pool = redis.ConnectionPool(host='localhost',port=6379)
conn = redis.Redis(connection_pool=pool)
"""
conn = redis.Redis(host='localhost',port=6379)
这条语句,与上面两条语句的作用效果是一样的
将localhost更改为远程redis服务器的ip地址,即可远程连接
"""

conn.set('name','粉条',4) #4代表的是失效时间 单位为s
#对于汉字存储数据默认返回16进制 如果需要转换 要解码为utf-8编码格式    当我们实际工作中遇到了什么乱码,只需要使用正确的解码方式对于二进制数据进行解码即可
print(conn.get('name').decode('utf-8'))
print('等待3s....')
time.sleep(3)
print(conn.get('name'))  #输出的是16进制所表示的数据

-------------------------------------------------------

# 获取所有的key值
print(conn.keys())
print(len(conn.keys()))

# 当前redis数据库中数据条数
print(conn.dbsize())

在这里插入图片描述
在这里插入图片描述

import time
import redis

pool= redis.ConnectionPool(host='172.25.254.1',port=6379)
conn = redis.Redis(connection_pool=pool)
conn.set('name','fentiao',3)
conn.set('age',10,3)
conn.set('score',100,3)
print(conn.get('name'))

# 删除指定的key-value值
conn.delete('score')
print('正在删除key...')
print(conn.get('score'))

print('清除前:',conn.keys())
# 清除redis里面的所有key-value
conn.flushall()
print('清除后:',conn.keys())

在这里插入图片描述

import redis

conn = redis.Redis(host='172.25.254.1',port=6379)

# 选择集合存储
conn.sadd('python','user1')
conn.sadd('python','user2')
conn.sadd('python','user3')
conn.sadd('movie','user1')
conn.sadd('movie','user6')
conn.sadd('movie','user7')
# 获取某个圈子的成员
print(conn.smembers('python'))   # 使得一个键(python)对应了多个值
print(conn.smembers('movie'))
# 获取两个圈子共同拥有的成员(交集)
print(conn.sinter('python','movie'))
# 获取并集
print(conn.sunion('python','movie'))

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值