基于python下的MySQL数据库和socket套接字

什么是MySQL数据库?

MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),
使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。
MySQL是开放源代码的,因此任何人都可以在General Public License
的许可下下载并根据个性化的需要对其进行修改。
MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在
不需要事务化处理的情况下,MySQL是管理内容最好的选择。

搭建MySQL数据库与python的联系:

首先配置好yum源进行配置环境:
[root@foundation38 yum.repos.d]# yum install mariadb-server -y  安装服务
[root@foundation38 yum.repos.d]# systemctl start mariadb  开启服务
[root@foundation38 yum.repos.d]# systemctl status mariadb  查看服务状态
[root@foundation38 yum.repos.d]# systemctl stop firewalld  关闭防火墙
[root@foundation38 html]# mysql_secure_installation  重置密码

Set root password? [Y/n] 
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!
[root@foundation38 yum.repos.d]# mysql -uroot -p  登陆
[root@foundation38 yum.repos.d]# yum install gcc -y  安装
[root@foundation38 yum.repos.d]# yum search MySQL-python
[root@foundation38 yum.repos.d]# yum install MySQL-python.x86_64 -y  安装服务
[root@foundation38 yum.repos.d]# pip install Mysql-Python  建立连接
在pycharm中导入import MySQLdb即可

这里写图片描述
在pycharm中导入模块进行测试可以正常导入:
这里写图片描述
数据库可以正常登陆:
这里写图片描述

搭建网页版来管理数据库:

将安装包放到/car/www/html/目录下
[root@foundation38 Desktop]#yum install httpd php php-mysql -y
[root@foundation38 Desktop]# cd /var/www/html/
[root@foundation38 html]# ls
phpMyAdmin-3.4.0-all-languages.tar.bz2  source7.3
[root@foundation38 html]# tar zxf phpMyAdmin-3.4.0-all-languages.tar.bz2 

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
[root@foundation38 html]# tar jxf phpMyAdmin-3.4.0-all-languages.tar.bz2 
[root@foundation38 html]# ls
phpMyAdmin-3.4.0-all-languages          source7.3
phpMyAdmin-3.4.0-all-languages.tar.bz2
[root@foundation38 html]# rm -fr phpMyAdmin-3.4.0-all-languages.tar.bz2 
[root@foundation38 html]# ls
phpMyAdmin-3.4.0-all-languages  source7.3
[root@foundation38 html]# mv phpMyAdmin-3.4.0-all-languages/ mysqladmin
[root@foundation38 html]# ls
mysqladmin  source7.3
[root@foundation38 html]# cd mysqladmin/
[root@foundation38 mysqladmin]# cp config.sample.inc.php config.inc.php

这里写图片描述
在浏览器测试输入172.25.38.250/mysqladmin/会进入登陆界面
这里写图片描述

数据库的管理:

[kiosk@foundation38 ~]$ mysql -uroot -p  登陆数据库
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 18
Server version: 5.5.52-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;  查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

MariaDB [(none)]> create database python; 创建数据库
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases; 查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| python             |
+--------------------+
4 rows in set (0.00 sec)

这里写图片描述

MariaDB [(none)]> use python;  进入python数据库
Database changed
MariaDB [python]> create table userInfo(id int,name varchar(10));  建立数据表
Query OK, 0 rows affected (0.07 sec)

MariaDB [python]> show tables;   查看数据表
+------------------+
| Tables_in_python |
+------------------+
| userInfo         |
+------------------+
1 row in set (0.00 sec)

MariaDB [python]> select * from userInfo; 表内为空
Empty set (0.00 sec)

这里写图片描述

MariaDB [python]> insert into userInfo(id,name)value(1,'tom');  插入字段
Query OK, 1 row affected (0.04 sec)

MariaDB [python]> select * from userInfo;  查看表结构
+------+------+
| id   | name |
+------+------+
|    1 | tom  |
+------+------+
1 row in set (0.00 sec)

MariaDB [python]> select id from userInfo;  查看id
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

这里写图片描述

MariaDB [python]> select name from userInfo;  查看name
+------+
| name |
+------+
| tom  |
+------+
1 row in set (0.00 sec)

MariaDB [python]> update userInfo set name = 'harry' 更新名字
    -> ;
Query OK, 1 row affected (0.28 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [python]> select name from userInfo; 再次查看名字
+-------+
| name  |
+-------+
| harry |
+-------+
1 row in set (0.00 sec)
MariaDB [python]> update userInfo set name = 'tom' where id=1;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

这里写图片描述

MariaDB [python]> select name from userInfo;  查看name
+------+
| name |
+------+
| tom  |
+------+
1 row in set (0.00 sec)

MariaDB [python]> select * from userInfo; 查看表结构
+------+------+
| id   | name |
+------+------+
|    1 | tom  |
+------+------+
1 row in set (0.00 sec)

这里写图片描述

建立好数据库和python连接之后直接导入import MySQLdb即可(就可以在python解释器中执行数据库的操作)

基本格式:

MySQL 数据库
host : MySQL 数据库地址
user: 数据库登陆用户名
passwd: 数据库登陆密码
db: 登陆数据库后,需要操作的库名
port: 数据库监听端口,默认为 3306
charset: 数据库编码MySQL连接操作
commit() 如果数据库表进行了修改,提交保存当前的数据。
rollback() 如果有权限,就取消当前的操作,否则报错
cursor() 游标指针。

查询数据库(只输出改变了几行)

之后的代码格式都是一样的只是替换数据库的操作方法罢了

import MySQLdb
# 打开门
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='westos', db='python')
# 伸出手
cur = conn.cursor()
# 拿东西
recont = cur.execute('select * from userInfo')
# 把手伸回来
cur.close()
# 把门关上
conn.close()
print recont

这里写图片描述

查询数据库(返回内容)

import MySQLdb
# 打开门
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='westos', db='python')
# 伸出手
cur = conn.cursor()  # 创建了一个手
# 拿东西
# 这个操作影响了多少行数(有多少行被操作了)
recont = cur.execute('select * from userInfo')
data = cur.fetchall()
# 把手伸回来
cur.close()
# 把门关上
conn.close()
print recont
print data

这里写图片描述

查询数据库(以字典输出)

import MySQLdb
# 打开门
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='westos', db='python')
# 拿到数据库的表头
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
# 拿东西
# 这个操作影响了多少行数(有多少行被操作了)
recont = cur.execute('select * from userInfo')
data = cur.fetchall()
# 把门关上
conn.close()
print recont
print data

这里写图片描述

在网页建立一张新的数据表:

建立表结构:
这里写图片描述
建立成功:
这里写图片描述

数据表的插入字段操作:

import MySQLdb
# 打开门
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='westos', db='python')
# 伸出手
cur = conn.cursor()
# 操作数据
sql = 'insert into usermg(id,name,address) value(%s,%s,%s)'
params = ('1','dd','usa')
recount = cur.execute(sql,params)
# 提交请求
conn.commit()
# 把手伸回来
cur.close()
# 把门关上
conn.close()
print recount

控制台只输出了操作了几行:
这里写图片描述
在网页查看效果已经插入成功:
这里写图片描述

数据表一次性插入多条字段操作:

import MySQLdb
# 打开门
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='westos', db='python')
# 伸出手
cur = conn.cursor()
# 操作数据
li = [
    ('2', 'hahaha', 'wwww'),
    ('3', 'lalala', 'qqqq'),
]
recount = cur.executemany('insert into usermg(id,name,address) values(%s,%s,%s)',li)

# 提交请求
conn.commit()
# 把手伸回来
cur.close()
# 把门关上
conn.close()
print recount

这里写图片描述
网页查看效果(插入成功):
这里写图片描述

更新数据表字段信息:

import MySQLdb
# 打开门
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='westos', db='python')
# 伸出手
cur = conn.cursor()
# 操作数据
sql = 'update usermg set name = %s where id = %s'
params = ('uu', 1,)
recount = cur.execute(sql,params)
# 提交请求
conn.commit()
# 把手伸回来
cur.close()
# 把门关上
conn.close()
print recount

这里写图片描述
网页查看效果:
这里写图片描述

删除数据表内的字段:

import MySQLdb
# 打开门
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='westos', db='python')
# 伸出手
cur = conn.cursor()
# 操作数据
sql = 'delete from usermg where id = %s'
params = (1,)  删除id为1的字段,1后面的逗号表示这是一个元组
recount = cur.execute(sql,params)
# 提交请求
conn.commit()
# 把手伸回来
cur.close()
# 把门关上
conn.close()
print recount

这里写图片描述
在网页查看效果:
这里写图片描述

在网页建立新的数据表并插入字段信息:

这里写图片描述

提交和回滚,在数据库里叫事物操作:

在同一张数据表一增一减时若有一个出现错误,则两个都不会执行,会返回原来的结果,这种操作叫做回滚,不会出现数据丢失的情况。

import MySQLdb
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='westos', db='python')
cur = conn.cursor()

sql = 'update count set money = %s where id = 1'
params = ('0',)
recount = cur.execute(sql,params)

sql = 'update count set money = %s where id = 2'
param = ('100',)
recoun = cur.execute(sql,param)
conn.commit()

这里写图片描述
在网页查看已经更新成功:
这里写图片描述

什么是socket套接字:

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端
称为一个socket,所谓socket通常也称作“套接字”,用于描述IP地址和端口,
是一个通信链的句柄,应用程序通常通过“套接字”向网络发出请求或应答网络请求
socket起源于Uinx,而Unix/Linux基本哲学之一就是“一切皆文件”,
都可以用“打开open-->读写write/read-->关闭close”模式来操作,
socket就是该模式的一个实现,socket即是一种特殊的文件,一些
socket函数就是对其进行的操作(读/写 IO,打开,关闭)
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,
取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个
通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。
每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应
于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台
主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供
220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。 
客户软件将插头插到不同编号的插座,就可以得到不同的服务
例如:中国移动客服
对于移动来说:一直监听一个号码10086,当有电话进来后,
就分配一个客服和客户去沟通并处理请求,对于用户:需要知道
10086这个号码,并需要打电话

建立服务端:

import socket

# 1.创建socket对象
sk = socket.socket()
# 2.绑定端口和ip
ip_port = ('127.0.0.1', 9999)
sk.bind(ip_port)
# 3.最大连接数
sk.listen(5)

while True:
    # 获取客户端的ip和端口号
    conn, address = sk.accept()
    conn.send('hello')
    conn.close()

这里写图片描述

建立一个客户端:

import socket

# 创建一个socket对象
client = socket.socket()

# 创建连接
ip_port = ('127.0.0.1',9999)
client.connect(ip_port)
# 获取数据
data = client.recv(1024)
print data

这里写图片描述

让服务端一直运行,在终端调用python client.py

但是这种方式没有交互,只有单一的输出

[kiosk@foundation38 ~]$ cd /home/kiosk/
[kiosk@foundation38 ~]$ ls
3.jpg      ipython   pycharm-community-2016.3.2         python第一天
Desktop    Music     pycharm-community-2016.3.2.tar.gz  Templates
Documents  Pictures  PycharmProjects                    Videos
Downloads  Public    python
[kiosk@foundation38 ~]$ cd PycharmProjects/
[kiosk@foundation38 PycharmProjects]$ ls
python
[kiosk@foundation38 PycharmProjects]$ cd python/day08/
[kiosk@foundation38 day08]$ ls
mysql数据库  socket套接字  多线程
[kiosk@foundation38 day08]$ cd socket套接字/
[kiosk@foundation38 socket套接字]$ ls
client.py  server.py  一问一答server.py
[kiosk@foundation38 socket套接字]$ python client.py
hello
[kiosk@foundation38 socket套接字]$ python client.py
hello

这里写图片描述

交互式一问一答socket:

一问一答server:

import socket

# 1.创建socket对象
sk = socket.socket()
# 2.绑定端口和ip
ip_port = ('127.0.0.1', 9998)
sk.bind(ip_port)
# 3.最大连接数
sk.listen(5)

while True:
    # 获取客户端的ip和端口号
    conn, address = sk.accept()
    conn.send('hello')
    flag = True
    while flag:
        data = conn.recv(1024)
        print data
        if data == 'exit':
            flag = False
        conn.send('hi')
    conn.close()

这里写图片描述

一问一答client:

import socket
# 创建一个socket对象
client = socket.socket()
# 创建连接
ip_port = ('127.0.0.1',9998)
client.connect(ip_port)

while True:
    # 获取数据
    data = client.recv(1024)
    print data
    # 发送数据
    inp = raw_input('client:')
    client.send(inp)
    if inp == 'exit':
        break

这里写图片描述

让服务端一直运行,在终端调用python 一问一答client.py

[kiosk@foundation38 socket套接字]$ ls
client.py  server.py  socket笔记.py  一问一答client.py  一问一答server.py
[kiosk@foundation38 socket套接字]$ python 一问一答client.py 
hello
client:hi
hi
client:exit

这里写图片描述

猜你喜欢

转载自blog.csdn.net/aaaaaab_/article/details/81202200