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:

  1. # 执行SQL语句,原生的SQL写法 orm
  2. # sheet_name表示的是想要导入的表名
  3. result = conn.execute("select * from sheet_name")
  4. print(result.fetchone())
  1. 1、通过SQLALchemy中导入create_engine(引擎、驱动)方法,通过这个函数创建引擎<br />2、通过engine.connect()来连接数据库,如果需要传递满足某种格式的字符串是,需要更上?charset=某某格式
  2. <a name="Ve90C"></a>
  3. ### 3、创建数据库引擎的注意点
  4. 关于DB_URL = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"的说明:
  5. ```python
  6. # 标准格式
  7. dialect+driver://username:password@host:port/database?charset=utf8
  1. dialect是数据库的实现,比如MySQL、PostgreSQL、SQLite,需要转化为小写
  2. driver是Python对应的驱动,如果不指定,会选择默认的驱动,比如MySQL的默认驱动是MySQLdb
  3. username是连接数据库的用户名
  4. password是连接数据库的密码
  5. host是连接数据库的域名
  6. port是数据库监听的端口号
  7. database是连接数据库的名字
  8. 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

  1. DB_URL = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}"

效果对比如下:
更改前:
image.png
更改后:
image.png
4、通过SQLALchemy执行原生SQL语句
将上面的连接数据库的例子存放在constants.py文件中

  1. from sqlalchemy import create_engine
  2. # 从创建的constants.py文件中导入DB_URL属性
  3. from constants import DB_URI
  4. #连接数据库
  5. engine = create_engine(DB_URI,echo=True)
  6. # 使用with语句连接数据库,如果发生异常会被捕获
  7. with engine.connect() as con:
  8. # 先删除users表
  9. con.execute('drop table if exists authors')
  10. # 创建一个users表,有自增长的id和name
  11. con.execute('create table authors(id int primary key auto_increment,'name varchar(25))')
  12. # 插入两条数据到表中
  13. con.execute('insert into persons(name) values("abc")')
  14. con.execute('insert into persons(name) values("xiaotuo")')
  15. # 执行查询操作
  16. results = con.execute('select * from persons')
  17. # 从查找的结果中遍历
  18. for result in results:
  19. print(result)