1、SQLALchemy介绍和基本使用
数据库是一个网站的基础,在flask中可以使用多种数据库,比如MySQL,MongoDB,SQLite,PostgreSQL等。下面将以MySQL为例:在flask中,会使用ORM来操作数据库
相关模块的安装:
- mysql
- pymysql:pymysql是用Python来操作mysql的包(通俗理解驱动)
- SQLALchemy:SQLAlchemy是一个数据库的ORM框架
- [mysql-connector]:(驱动)
2、通过SQLALchemy连接数据库
```python from sqlalchemy import create_engine
连接数库
地址
HOSTNAME = “127.0.0.1”
需要连接的数据库名
DATABASE = ‘my_sql’
端口
PORT = 3306
用户名和密码
USERNAME = “root” PASSWORD = “147258”
创建数据库引擎
DB_URL = f”mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8”
engine = create_engine(DB_URL)
创建连接
with engine.connect() as conn:
# 执行SQL语句,原生的SQL写法 orm
# sheet_name表示的是想要导入的表名
result = conn.execute("select * from sheet_name")
print(result.fetchone())
1、通过SQLALchemy中导入create_engine(引擎、驱动)方法,通过这个函数创建引擎<br />2、通过engine.connect()来连接数据库,如果需要传递满足某种格式的字符串是,需要更上?charset=某某格式
<a name="Ve90C"></a>
### 3、创建数据库引擎的注意点
关于DB_URL = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"的说明:
```python
# 标准格式
dialect+driver://username:password@host:port/database?charset=utf8
- dialect是数据库的实现,比如MySQL、PostgreSQL、SQLite,需要转化为小写
- driver是Python对应的驱动,如果不指定,会选择默认的驱动,比如MySQL的默认驱动是MySQLdb
- username是连接数据库的用户名
- password是连接数据库的密码
- host是连接数据库的域名
- port是数据库监听的端口号
- database是连接数据库的名字
- charset是字符集编码
在运行上面的代码块是会出现警告;Warning: (1366, “Incorrect string value: ‘\xD6\xD0\xB9\xFA\xB1\xEA…’ for column ‘VARIABLE_VALUE’ at row 518”) result = self._query(query)
这是由于python更新导致的,此时需要更换驱动也就是上述的driver参数,步骤如下:
1、安装mysql -connector模块,pip install mysql -connector —user
2、修改驱动为mysqlconnector
DB_URL = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}"
效果对比如下:
更改前:
更改后:
4、通过SQLALchemy执行原生SQL语句
将上面的连接数据库的例子存放在constants.py文件中
from sqlalchemy import create_engine
# 从创建的constants.py文件中导入DB_URL属性
from constants import DB_URI
#连接数据库
engine = create_engine(DB_URI,echo=True)
# 使用with语句连接数据库,如果发生异常会被捕获
with engine.connect() as con:
# 先删除users表
con.execute('drop table if exists authors')
# 创建一个users表,有自增长的id和name
con.execute('create table authors(id int primary key auto_increment,'name varchar(25))')
# 插入两条数据到表中
con.execute('insert into persons(name) values("abc")')
con.execute('insert into persons(name) values("xiaotuo")')
# 执行查询操作
results = con.execute('select * from persons')
# 从查找的结果中遍历
for result in results:
print(result)