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'))