Python连接操作mysql服务器

一、Mysql命令行连接

MySQL sever端的安装配置过程省略。Window下载安装包安装,Linux可以下载源码编译,或者通过apt-get(Ubantu) 或者yum(CentOS/RHEL)来安装。
启动mysql-server:
Windows:net start mysql
Linux:service mysqld start 或者 systemctl start mysqld
MySQL安装完成后默认端口3306,通过mysql-admin连接mysql-server的命令行语句为

mysql [-h <服务器ip地址>] [-P <端口号>] -u <用户名> -p 

然后输入服务器管理密码即可登录mysql服务器。其中-h可以省略,默认localhost,-P可以省略,默认3306。
Window执行上述命令时需要先确认MySQL的安装目录已经加入到Path环境变量,或者cd进入安装目录。

二、Mysql远程访问

如果只需要连接本机的mysql,可以跳过这一部分。
MySQL默认拒绝远程访问,只能通过安装mysql服务器的本地进行访问,也即只能通过localhost(127.0.0.1)访问。如果需要远程登录,需要手动开启访问权限。

防火墙策略设置

关闭防火墙或者设置防火墙开放3306端口
Window可以通过界面操作。
Linux开放3306端口的方法如下:

iptables -I INPUT -p tcp --dport 3306 -m state --state NEW -j ACCEPT
service iptables restart
# systemctl restart firewalld 

如果是云服务器,还需要在服务器运营商处同时开放3306端口,以阿里云轻量应用服务器为例:
Python连接操作mysql服务器_第1张图片

设置允许访问的ip范围

接下来还需要在服务器端配置mysql使其允许除localhost之外的ip访问。安装MySQL之后,默认会创建一个名为mysql的数据库,里面存放了MySQL的一些配置信息,登录MySQL后:

use mysql;
select host,user from user;
+--------------+------+
| host         | user |
+--------------+------+
| 127.0.0.1    | root |
| localhost    | root |
| ::1          | root |
+--------------+------+
3 rows in set (0.00 sec)

其中host字段控制了允许访问该服务器上mysql服务的所有ip,可以将其中的“localhost”改为通配符“%”,这样就允许所有ip访问该服务器上的mysql服务了,语法如下:

update user set host="%" where host="localhost";

接下来使用flush privileges;语句来刷新权限,再次查看user表:

mysql> select Host,User from user;
+-----------+------+
| Host      | User |
+-----------+------+
| %         | root |
| 127.0.0.1 | root |
| ::1       | root |
+-----------+------+
3 rows in set (0.00 sec)

这时候就能用任意ip的电脑来访问这台计算机上的MySQL服务了。登录服务需要的密码和本地登录的密码相同。
为了安考虑,有时候需要止允许特殊ip的某一台电脑能够访问,只需要将“%”改为需要访问服务的特殊ip就可以了。

三、Python pymysql使用

pymysql是Python连接Mysql数据库的一种驱动,可以驱动mysql去执行SQL语句。
下面实现了运用pymysql执行简单SQL语句:

import pymysql
from config import mysql_pd, mysql_user

db = pymysql.connect(
    host='xx.xx.xx.xx', # 需要连接的ip
    port=3306, # 端口,可不填,默认3306
    user=mysql_user, # 用户名
    password=mysql_pd, # 密码
    database='test_database' # 连接的数据库名
)

cursor = db.cursor() # 定义cursor来执行SQL语句
cursor.execute('create table testtable(ID INT);')
db.commit() # 数据库写入
db.close() # 关闭数据库连接

四、ORM框架进行数据库操作

ORM(Object Relation Mapping)是对数据库表结构映射成Python中的(Class),这样操作数据库就映射成了对类的操作,每一条记录(record)就映射成了一个对象实例。数据库的增删改查操作不需要执行SQL语句,减小了操作的难度。
SQLAlchemy是最流行的ORM框架之一,安装SQLAlchemy:pip install sqlalchemy

SQLAlchemy创建表

由于Mysql中的一个表就相当于Python中的一个类,于是我们只需要创建一个类,这个类继承自SQLAlchemy提供的一个Base类。

from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class TestTable(Base):
    __tablename__ = 'test_table'

    id = Column(String(10), primary_key=True)
    name = Column(String(50), nullable=False)

    def __repr__(self):
        return ''.format(self.id, self.name)

上面定义的__tablename__变量决定了写入数据库时的表名,接下来定义的id和name是数据库的两个字段,都为VARCHAR类型,id为主键,name非空。最后的__repr__方法为可选项,决定了打印实例是的显示方式。
创建好上述类之后还要把这个对应表的类映射到数据库中去。这就需要通过驱动对数据进行连接(下面用的是pymysql驱动连接mysql的实例):

from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://root:mysqlpassword@localhost/dbname', echo=False)
Base.metadata.create_all(engine)

连接制定的字符串格式是:
mysql+<连接使用的驱动>://<用户名>:<密码>@<主机名或IP>/<数据库名>
执行Create_all()之后就可以成功在制定数据库下面创建一张表。

增删改查

数据操作同样需要先连接数据库,方法同上。
连接后可以通过简单的方法来直接进行数据的增删改查工作。

from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql+pymysql://root:mysqlpassword@localhost/horror_movies', echo=False)
Base = declarative_base()


class Movies(Base):
    __tablename__ = 'movies'

    ID = Column(String(10), primary_key=True)
    name = Column(String(50), nullable=False)

    def __repr__(self):
        return ''.format(self.id, self.name)


Session = sessionmaker()  
Session.configure(bind=engine)
session = Session()  # 创建session
record1 = Movies(ID='1', name='XiaoMing')  # 创建新的对象实例
session.add(movie1)  # 新增数据(insert)
session.commit()  # 提交到数据库
record2 = session.query().first()  # 查找表中的第一个数据
record2.name = 'XiaoGang'  # 更新数据库
session.commit()  # 提交到数据库
session.delete(record2)  # 删除查找到的数据
session.commit()  # 提交到数据库

通过query()查找数据时,返回的是上面创建的Movies对象,如果用将查询条件的first()换成all()来获取数据库中所有记录,则会返回一个Movies对象的列表。
对数据进行操作后需要commit()函数才能将数据提交数据库生效,在此之前,数据操作不会生效。并且,SQLAlchemy只有在第一次提交数据的时候才与数据库进行连接。

你可能感兴趣的:(Python连接操作mysql服务器)