- 安装mysql数据库
- 修改mysql,使得可远程登录
-
-- 修改mysql服务器的mysql数据库的 user 表中的 host字段 update user set host = '%' where user = 'root'; FLUSH RIVILEGES alter user 'root'@'%' identified with mysql_native_password by '[密码]'; flush privileges;
- 使用ORM (Object Relational Mapping 关系对象映射) 的方式管理数据库,SQLAlchemy 是ORM的工具
- 安装 SQLAIchemy
-
$ sudo apt-get update $ sudo pip3 install sqlalchemy
- 将MySQL默认的编码改为utf-8
-
$ sudo vim /etc/mysql/my.cnf # 打开文件后添加如下配置 [client] default-character-set = utf8 [mysqld] character-set-server = utf8 [mysql] default-character-set = utf8
- 安装python与mysql连接的驱动程序
-
$ sudo pip3 install pymysql
- 导入pymysql 并用 pymysql代替 MySQLdb模块
import pymysql pymysql.install_as_MySQLdb()
- 初始化数据库连接,并获取连接数据库的连接引擎engine
engine = create_engine('mysql+mysqldb://root:root@localhost:3306/testdb?charset=utf8', isolation_level='READ UNCOMMITTED', #定义事务约束条件 echo=False, # 不打印SQL语句 pool_size = 30, # 定义连接池大小 pool_recycle=7200。# 定义连接时长为2小时 )
SQLAlchemy 是通过 Engine 来驱动,Engine 维护了一个连接池(Pool)对象和方言(Dialect),方言简单而言就是你连的到底是 MySQL 还是 Oracle 或者 PostgreSQL 还是其它数据库。连接池很重要,因为每次发送sql查询的时候都需要先建立连接,如果程序启动的时候事先就初始化一批连接放在连接池,每次用完后又放回连接池给其它请求使用,就能大大提高查询的效率
通过函数 create_engine 就可以创建连接引擎engine
构建好 Engine 对象的同时,连接池和Dialect也创建好了,但是这时候并不会立马与数据库建立真正的连接,只有你调用 Engine.connect() 或者 Engine.execute(sql) 执行SQL请求的时候,才会建立真正的连接。因此 Engine 和 Pool 的行为称之为延迟初始化。
echo :为 True 时候会把sql语句打印出来
pool_size: 是连接池的大小,默认为5个,0表示连接数无限制
pool_recycle: MySQL 默认情况下如果一个连接8小时内容没有任何动作(查询请求)就会自动断开链接,出现 MySQL has gone away的错误。设置了 pool_recycle 后 SQLAlchemy 就会在指定时间内回收连接。如果设置为3600 就表示 1小时后该连接会被自动回收。
pool_pre_ping : 这是1.2新增的参数,如果值为True,那么每次从连接池中拿连接的时候,都会向数据库发送一个类似 select 1 的测试查询语句来判断服务器是否正常运行。当该连接出现 disconnect 的情况时,该连接连同pool中的其它连接都会被回收。 - 创建对象基类
Base = declarative_base()
- 定义与数据库中表相对应的类
class Test(Base): """ 描述信息 """ __tablename__ = 'test_table' nameId = Column(String(30), primary_key=True) name = Column(String(30),unique=True) # ...
- 实施建表操作,完成类与表的映射
Base.metadata.create_all(engine)
- 创建会话类
Session = sessionmaker(bind=engine)
- 创建会话类对象
session = Session()
- 业务逻辑操作,执行SQL语句
- 执行提交操作,将操作保持到数据库
session.commit()
- 关闭会话对象
session.close()