传统数据记录和存储的缺点: 现代文件存储方式虽然在很大程度上克服了上面的困难,但还是存在一定缺陷: 数据库的特点: 我们在网站或者应用软件是看到的具有美观格式的数据其实都是通过查询后端数据库并使用特定格式渲染出来的。 对数据库简单直白的理解: MySQL是一个关系型数据库,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗下产品。 关于MySQL数据库的更多内容可参考Python全栈(三)数据库优化之1.数据库简介。 服务端用于开启MySQL服务。 可点击https://download.csdn.net/download/CUFEECR/12340408下载phpstudy并安装。 sqlyog可点击https://download.csdn.net/download/CUFEECR/12340815下载,解压后按照说明安装。 在SQLYog中创建数据库、表和插入数据的演示如下: 新版Flask支持的MySQL版本必须大于等于5.5。 关于数据库安装的更多内容可参考Python全栈(三)数据库优化之1.数据库简介。 数据库是一个网站的基础,Flask可以使用很多种数据库,如MySQL、MongoDB、SQLite、PostgreSQL等。这里使用MySQL。 Flask操作数据库,需要先安装一些所需的库; 使用sqlalchemy执行原生SQL语句示例如下: 首先用sqlalchemy导入的函数 其中,dialect是数据库的类型,比如MySQL、PostgreSQL、SQLite等,并且转换成小写; 再调用该实例的 运行结果如下: 查询到了第一条数据,但是同时有一条警告消息,这是创建数据库引擎时使用的DB_URL产生的问题,猜测可能是MySQL驱动的问题,可以将pymysql连接数据库换成官方的连接引擎,即使用之前安装的mysql-connector来解决这个问题,如下: 打印: 显然,此时未出现警告信息。 执行更多原生SQL语句测试如下: 同时编辑执行原生SQL语句的Python文件如下: 运行之后,打印: 随着项目规模的增大,采用原生SQL的方式会导致代码中大量的SQL语句,并对项目的进展产生不利影响: 此时我们可以选择ORM进行优化。 ORM的优点如下: 模型通过ORM再转到数据库中操作,执行过程如下: 要使用ORM来操作数据库,首先需要创建一个类来与对应的表进行映射。 使用ORM创建表示例如下: SQLAlchemy会自动为第一个类型为Integer、标记为主键并且没有被标记为外键的字段添加自增长的属性,因此以上例子中定义id字段时使用 创建完和表映射的类后,还没有真正的映射到数据库当中,需要执行代码文章目录
一、数据库介绍
1.数据库简介
从以上几幅图可以看到,数据存储经历了从口口相传、结绳记事、用龟片或贝壳、用竹简、青铜器、纸(莎纸、羊皮)到软盘、光盘、硬盘文件等漫长的发展,存储的内容越来越多,便捷性和持久性也越来越高。
不同编程语言操作文件的方式不同,如果切换语言操作文件会很不方便,扩展性较低。
数据存储到本地,不易丢失
保证各个字段的类型正确,值有意义。
一个Excel可以理解为一个数据库,一个Sheet可以理解为一个表,一个表的字段可以理解为表头,即一列对应一个字段,一行数据表示一条记录。同时不同的表中的数据还可以产生关系,如外键,如下图:
2.MySQL介绍
MySQL的特点
可以处理拥有上千万条记录的大型数据库3.MySQL数据库的安装
服务端安装
访问官网下载,但是可能很慢
通过phpStudy等安装。客户端安装使用
二、SQLAlchemy介绍和基本使用
1.SQLAlchemy简介
在Flask中,如果想要操作数据库,可以使用ORM,使用ORM操作数据库使数据库交互变得非常简单方便。
安装时,先进入虚拟环境所在目录,如果未切换到虚拟环境需要通过命令pipenv shell
进入虚拟环境。
需要安装的库如下:
pymysql是用Python来操作mysql的库,通过命令pip install pymysql
进行安装。
SQLAlchemy是一个数据库的ORM框架,通过命令pip install SQLAlchemy
安装。
用于通过Python连接数据库,安装命令为pip install mysql-connector
和pip install mysql-connector-python
。2.SQLAlchemy的基本使用
from sqlalchemy import create_engine # 主机地址 HOSTNAME = '127.0.0.1' # 数据库 DATABASE = 'flask_demo' # 端口号,一般固定,默认为3306 PORT = 3306 # 用户名和密码 USERNMAE = 'root' PASSWORD = 'root' # 创建数据库引擎 DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNMAE, PASSWORD, HOSTNAME, PORT, DATABASE) engine = create_engine(DB_URL) # 创建连接 with engine.connect() as conn: # 执行原生SQL语句 result = conn.execute("select * from users") print(result.fetchone())
create_engine()
创建引擎实例,其中传入该函数的参数形式为:dialect+driver://username:password@host:port/database?charset=utf8
driver是Python中操作对应数据库的驱动,如果不指定,会选择默认的驱动,比如MySQL的默认驱动是MySQLdb;
username是连接数据库的用户名;
password是该用户的密码;
host是连接数据库的域名;
port是数据库监听的端口号;
database是需要连接的数据库的名字。connect()
方法连接数据库,使用with语句连接数据库,如果发生异常会被捕获。XXXPythonPython37libsite-packagespymysqlcursors.py:170: Warning: (1366, "Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for column 'VARIABLE_VALUE' at row 485") result = self._query(query) (1, 'cl', 'corley', '123')
from sqlalchemy import create_engine # 主机地址 HOSTNAME = '127.0.0.1' # 数据库 DATABASE = 'flask_demo' # 端口号,一般固定,默认为3306 PORT = 3306 # 用户名和密码 USERNMAE = 'root' PASSWORD = 'root' # 创建数据库引擎 DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(USERNMAE, PASSWORD, HOSTNAME, PORT, DATABASE) engine = create_engine(DB_URL) # 创建连接 with engine.connect() as conn: # 执行原生SQL语句 result = conn.execute("select * from users") for r in result: print(r)
(1, 'cl', 'corley', '123') (2, 'tn', 'tony', '12345')
先在Python文件同级目录下创建文件constants.py,将之前文件中数据库配置选项的常量都放入该文件中,如下:# 主机地址 HOSTNAME = '127.0.0.1' # 数据库 DATABASE = 'flask_demo' # 端口号,一般固定,默认为3306 PORT = 3306 # 用户名和密码 USERNMAE = 'root' PASSWORD = 'root' DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(USERNMAE, PASSWORD, HOSTNAME, PORT, DATABASE)
from sqlalchemy import create_engine from constants import DB_URL # 创建数据库引擎 engine = create_engine(DB_URL) # 创建连接 with engine.connect() as conn: # 判断表存在则删除 conn.execute("drop table if exists staffs") # 创建表 conn.execute("create table staffs(id int primary key auto_increment, name varchar(30), salary int)") # 插入数据 conn.execute("insert into staffs values(default,'Corley', 10000),(default, 'Tony', 8000)") # 查询数据 results = conn.execute("select * from staffs") # 显示数据 for result in results: print(result)
(1, 'Corley', 10000) (2, 'Tony', 8000)
三、ORM介绍和SQLAlchemy的使用
1.ORM介绍
SQL语句较多,重复率较高,复用性较低,越复杂的SQL语句条件越多,代码会越来越多。
很多SQL语句是在业务逻辑中拼出来的,如果数据库需要更改,就要去修改这些代码逻辑,很容易漏掉或增加某些SQL语句的修改
原生的SQL语句SQL注入的风险较大。
ORM(Object Relationship Mapping),即对象关系映射,通过ORM,我们可以使用类和对象的方式去操作数据库,而不用写原生的SQL语句。
通过把表映射成类,把字段作为属性,把行作为实例,ORM在执行对象操作时最终把对应的操作转换为数据库的原生语句。
使用ORM进行数据库开发可以有效减少SQL语句,写出来的模型也更加直观。
可以更轻松地写出复杂的查询语句。
SQLAlchemy封装了底层的数据库实现,支持多个关系型数据库,包括MySQL、SQLite等。
2.SQLAlchemy的简单使用
在类中先定义表名,再定义字段,定义字段要用Column实例化后的对象实例。
Column()
实例化时的参数中,第一个是数据类型,剩下的是约束;
如果类型是String时,必须指定字符串最大长度。from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base # 主机地址 HOSTNAME = '127.0.0.1' # 数据库 DATABASE = 'flask_demo' # 端口号,一般固定,默认为3306 PORT = 3306 # 用户名和密码 USERNMAE = 'root' PASSWORD = 'root' # 创建数据库引擎 DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(USERNMAE, PASSWORD, HOSTNAME, PORT, DATABASE) engine = create_engine(DB_URL) # 继承declarative_base函数生成的基类 Base = declarative_base(engine) # ORM操作数据库 class Students(Base): # 指定数据库中的表 __tablename__ = 'students' # 给定字段 id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), nullable=False) gender = Column(Integer, default=1,comment='1为男,2为女') # 格式化打印,打印当前对象时会调用 def __repr__(self): return "<User(id='%s', name='%s', fullname='%s', password='%s')>" % (self.id, self.name, self.fullname, self.password) # 模型映射到数据库中 Base.metadata.create_all()
id = Column(Integer, primary_key=True)
语句即不设置autoincrement属性也会自动让id自增;
创建类时,要使所有的类都要继承自declarative_base()
函数生成的基类。Base.metadata.create_all()
才能将类映射到数据库中。
运行后查看sqlyog,刷新后可以看到:
显然,students表已经创建成功。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算