mysql 模型 参数1 参数2_SQLAlchemy操作MySQL、常用数据类型与参数

本文介绍了如何使用SQLAlchemy连接MySQL数据库,执行原生SQL,以及创建ORM模型。通过示例代码展示了数据库配置、连接、执行SQL语句(包括创建表、插入数据和查询数据),并详细解释了SQLAlchemy中常用的数据类型和参数。
摘要由CSDN通过智能技术生成

1.准备工作

数据库是一个网站的基础。Flask可以使用很多种数据库。比如MySQL,MongoDB,SQLite,PostgreSQL等。这里我们以MySQL为例进行讲解。而在Flask中,如果想要操作数据库,我们可以使用ORM来操作数据库,使用ORM操作数据库将变得非常简单。

在讲解Flask中的数据库操作之前,先确保你已经安装了以下软件:

mysql:如果是在windows上,到官网下载。如果是ubuntu,通过命令sudo apt-get install mysql-server libmysqlclient -dev -yq进行下载安装。

MySQLdb:MySQLdb是用Python来操作mysql的包,因此通过pip来安装,命令如下:pip install mysql-python。

pymysql:pymysql是用Python来操作mysql的包,因此通过pip来安装,命令如下:pip install pymysql。如果您用的是Python 3,请安装pymysql。

SQLAlchemy:SQLAlchemy是一个数据库的ORM框架,我们在后面会用到。安装命令为:pip install SQLAlchemy。

2.SQLAlchemy连接数据库

下面的代码可以实现SQLAlchemy连接数据库,

from sqlalchemy import create_engine

# 数据库的配置变量

HOSTNAME = '127.0.0.1' # 主机名

PORT = '3306' # 端口号

USERNAME = 'root' # 用户名

PASSWORD = '******' # 密码

DATABASE = 'test' # 数据库名称

DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

# 创建数据库引擎

engine = create_engine(DB_URL)

# 创建链接

with engine.connect() as con:

rs = con.execute('SELECT 1')

print(re.fetchone())

首先从sqlalchemy中导入create_engine,用这个函数来创建引擎,然后用engine.connect()来连接数据库。其中一个比较重要的一点是,通过create_engine函数的时候,需要传递一个满足某种格式的字符串,对这个字符串的格式来进行解释,

dialect+driver://username:password@host:port/database?charset=utf8

dialect是数据库的实现,比如MySQL、PostgreSQL、SQLite,并且转换成小写。driver是Python对应的驱动,如果不指定,会选择默认的驱动,比如MySQL的默认驱动是MySQLdb。username是连接数据库的用户名,password是连接数据库的密码,host是连接数据库的域名,port是数据库监听的端口号,database是连接哪个数据库的名字。

如果以上输出了1,说明SQLAlchemy能成功连接到数据库。

3.SQLAlchemy执行原生SQL

若要使用SQLAlchemy执行原生SQL,我们只需使用execute()函数即可实现。

我们将上一个例子中的数据库配置选项单独放在一个constants.py的文件中,看以下例子:

from sqlalchemy import create_engine

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)

4.ORM模型

ORM(Object Relationship Mapping)模型是对象模型与数据库表的映射,在python中的表现形式是一个类,这个类对应着数据库中的一个数据表;这个类的每一个属性对应数据表中的一个字段。

以下是创建ORM模型的过程,

from sqlalchemy import create_engine

from sqlalchemy import Column, String, Integer, Enum, DateTime # 导入属性

from sqlalchemy.dialects.mysql import LONGTEXT # 导入长文本类型

from sqlalchemy.ext.declarative import declarative_base # 导入库

import enum # 导入枚举模块

from datetime import datetime # 导入时间模块

HOSTNAME = '127.0.0.1' # 数据库地址

PORT = '3306' # 端口号

DATABASE = 'test' # 数据库名

USERNAME = 'root' # 用户名

PASSWORD = '******' # 密码

DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

engine = create_engine(DB_URI)

Base = declarative_base(engine) # 创建Base基类

class Hobby(enum.Enum): # 定义一个枚举类

h1 = "抽烟"

h2 = "喝酒"

h3 = "烫头"

class Student(Base): # 用Base类作为基类来写自己的ORM类

__tablename__ = "student" # 表名

# 创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型

# 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须是sqlalchemy给我们提供好的数据类型。

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

sid = Column(Integer)

age = Column(Integer)

hobby = Column(Enum(Hobby))

native_language = Column(Enum("中文", "英文"))

score = Column(Integer)

create_time = Column(DateTime, onupdate=datetime.now, default=datetime.now)

introduce = Column(LONGTEXT)

Base.metadata.create_all() # 将模型映射到数据库中

注意,一旦使用了Base.metadata.create_all()将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。

若想要重新映射,必须在Base.metadata.create_all()之前,先执行Base.metadata.drop_all()删除掉ORM模型。

5.SQLAlchemy常用数据类型与参数

数据类型

解释

Integer

整形,映射到数据库中是int类型

Float

浮点类型,映射到数据库中是float类型,占据32位

Double

双精度浮点类型,映射到数据库中是double类型,占据64位

String

可变字符类型,映射到数据库中是varchar类型,需要指定长度

Boolean

布尔类型,映射到数据库中的是tinyint类型

DECIMAL

定点类型,这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存储多少个数字,第二个参数表示小数点后有多少位

Enum

指定某个字段只能是枚举中指定的几个值,不能为其他值

Date

存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用datetime.date来指定

DateTime

存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中,可以使用datetime.datetime来指定

Time

存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用datetime.time来至此那个

Text

存储长字符串。一般可以存储6W多个字符。如果超出了这个范围,可以使用LONGTEXT类型。映射到数据库中就是text类型

LONGTEXT

长文本类型,映射到数据库中是longtext类型

Column常见参数

功能

primary_key

设置某个字段为主键

autoincrement

设置这个字段为自动增长的

default

设置某个字段的默认值。在发表时间这些字段上面经常用

nullable

指定某个字段是否为空。默认值是True,就是可以为空

unique

指定某个字段的值是否唯一。默认是False

onupdate

在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候,不会用onupdate的值,只会使用default的值。常用的就是update_time(每次更新数据的时候都要更新的值)

name

指定ORM模型中某个属性映射到表中的字段名。如果不指定,那么会使用这个属性的名字来作为字段名。如果指定了,就会使用指定的这个值作为参数。这个参数也可以当作位置参数,在第1个参数来指定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值