python--SQLAlchemy数据库操作-ORM

本文介绍了使用Python的ORM框架SQLAlchemy操作MySQL数据库的方法。详细讲述了如何安装环境、连接数据库,以及ORM的好处和理解。接着,文章展示了如何通过ORM创建表、定义字段数据类型,并进行增删改查操作,包括各种条件查询。此外,还讨论了外键约束,包括一对一、一对多、多对多的关系映射,并给出了示例代码。
摘要由CSDN通过智能技术生成

数据库简介

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

环境安装

在Flask操作数据库之前 需要安装这几个操作库

pip install pymysql

pip install SQLAlchemy

SQLAlchemy : SQLAlchemy 是一个数据库的 ORM 框架

通过SQLAlchemy 连接数据库

from sqlalchemy import create_engine

HOSTNAME = '127.0.0.1'#数据库地址
PORT = '3306'#端口号
DATABASE = 'world'#库名
USERNAME = 'root'#用户名
PASSWORD = '123456'#密码
#把配置信息和以上的连接数据 组合一下 指向DB_URL
DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset-utf-8'

#create_engine 创建数据库引擎  create_engine函数需要传递一个DB_url指向的字符串 链接数据库
engine = create_engine(DB_URL)

#判断是否链接成功
conn = engine.connect()
result = conn.execute('select * from user ')
print(result.fetchone())

ORM

对象关系映射 是用来描述对象和数据库之间映射的一种方式

ORM的好处

更加规范SQL 不需要手写SQL DB工程师

更加直观的数据关系 ---->对象 方便建模

可以屏蔽不同数据库直接的差异

ORM怎么理解

将表映射成class

将表中的数据 映射成Class的实例对象

ORM操作数据库

使用ORM创建表

要使用 ORM 来操作数据库,首先需要创建一个类来与对应的表进行映射。现在以 User表 来做为 例子,它有 自增长的id 、 name 、 fullname 、 password 这些字段,那么对应的类为:

先用一个伪代码 演示一下

class User(object):
    """User类就是一个数据表
    下面的 id、name、usernama、password 是类的属性,相当于数据库字段
    """
    id=id,
    name=name,
    username=username,
    password=password
 # 这个实例化对象 就相当于把User内的参数映射成了一条数据 
 #SQLAlchemy之后会在 底层执行这条数据库语句  
 U = User('xxx','xxx')
  

那么这样 操作数据库 就会像操作类那样 轻松了 上面的是理清思路的伪代码 不作为执行

字段的数据类型

字段的数据类型 只能是sqlalchemy提供的类型 所以需要导入sqlalchemy下的Column类来指定数据类型

id = Column(Integer, primary_key=True, nullable=False,autoincrement=True)

Column 类的参数:

  • ​ 第一个参数:是数据类型 Integer 是整型 String 是字符类型
  • ​ primary_key:是否为主键
  • ​ nullable:是否为空
  • ​ autoincrement:是否自增长
  • ​ default :默认值
  • ​ unique :是否唯一
开始创建数据表
from sqlalchemy import create_engine,Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base#导入declarative_base用于返回ORM需要的基类
HOSTNAME = '127.0.0.1'#数据库地址
PORT = '3306'#端口号
DATABASE = 'world'#库名
USERNAME = 'root'#用户名
PASSWORD = '123456'#密码
#把配置信息和以上的连接数据 组合一下 指向DB_URL
DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset-utf-8'
#create_engine 创建数据库引擎  create_engine函数需要传递一个字符串 链接数据库
engine = create_engine(DB_URL)
"""以上是链接信息"""



"""以下是创建数据表的ORM"""
#将创建好的数据库引擎传入declarative_base方法中,会创建一个对象
base = declarative_base(engine)
#1、创建一个ORM模型 这个ORM模型必须继承自sqlalchemy提供的基类
class Users(base):
    """给表起名字: tablename的属性值是数据表的名字"""
    __tablename__ = 'users'
#2、添加类的属性与数据表的字段进行一一映射,这些属性的数据类型 必须是sqlalchemy提供的数据类型
    id = Column(Integer, primary_key=True, nullable=False,autoincrement=True)
    name = Column(String(50), nullable=False)#String也是一个类 需要传递一个长度参数 这里我设置成50
    age = Column(Integer,primary_key=False, nullable=False)
#3、将创建好的ORM模型 映射到数据库中执行 创建数据表
base.metadata.create_all()

创建表的ORM模型就写好了 运行一下

需要注意:使用metadata.create_all() 创建表以后 后续再添加更改表字段 也不会再映射了

sqlalchemy常用数据类型

​ Integer :整形。
​ Float :浮点类型。
​ Boolean :传递 True/False 进去。
​ DECIMAL :定点类型。
​ enum :枚举类型。
​ Date :传递 datetime.date() 进去。
​ DateTime :传递 datetime.datetime() 进去。
​ Time :传递 datetime.time() 进去。
​ String :字符类型,使用时需要指定长度,区别于 Text 类型。
​ Text :文本类型。
​ LONGTEXT :长文本类型

使用ORM进行增删改查操作

构建Session对象

1、需要先构建session对象 所有的数据库的ORM操作都必须通过 叫Session的会话对象来实现 通过以下代码来获取会话对象

from sqlalchemy.orm import sessionmaker#导入sessiond对象 它的作用和declarative_base有些类似 
#数据库引擎
engine = create_engine(DB_URL)

#数据库引擎装载这数据库链接信息 
#将数据库引擎传入sessionmaker内 返回一个对象
Session = sessionmaker(engine)
session = Session()#将返回的对象需要再次进行实例化 

"""上面两行创建Session对象的代码 也可以用下面的一行代码表示"""
session = sessionmaker(engine)()
增加数据
from sqlalchemy import create_engine,Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker#导入sessiond对象 它的作用和declarative_base有些类似 
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'world'
USERNAME = 'root'
PASSWORD = '123456'

DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset-utf-8'
#数据库引擎
engine = create_engine(DB_URL)
base = declarative_base(engine)


#构建session对象
session = sessionmaker(engine)() 

class Users(base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True, nullable=False,autoincrement=True)
    name = Column(String(50), nullable=False)
    age = Column(Integer,primary_key=False, nullable=False)
    
   """--------以下是插入数据的操作-------"""
def add_data():
    """增操作"""
    #将要插入的一条数据传到Users的对象中
    u = Users(name="zhiliao",age=18)
    #调用session的add方法 把数据传进去 
    session.add(u)
    #这个时候 数据还只在内存中 还需要执行commit才能写入数据库 
    session.commit()
if __name__ == "__main__":
    add_data()    
    
'''上面是添加单条数据,再来试一下 一次多条数据'''

def add_data():
    """增操作"""
    #将要插入的数据传到Users的对象中
    u1 = Users(name="wuya",age=18)
    u2 = Users(name="sanmu",age=21)
    #u1、u2先放在列表中然后用add_all方法进行添加
    session.add_all([u1,u2])
    #这个时候 数据还只在内存中 还需要执行commit才能写入数据库 
    session.commit()
if __name__ == "__main__":
    add_data()     

查询数据操作

查询全部

调用session的query方法查询Users模型对应的表中查找数据 后面**all()**方法可以把这张表符合条件的数据全部查找出来

def search_data():
    """查操作"""
    #调用session对象下的query方法
    all_Users = session.query(Users).all()
    print(all_Users)
if __name__ == "__main__":
    search_data()
>>>[<__main__.Users object at 0x000001A06265C880>, <__main__.Users object at 0x000001A06265C8E0>, <__main__.Users object at 0x000001A06265CA60>, <__main__.Users object at 0x000001A06265CAF0>]    
query可用参数
  1. 模型对象。指定查找这个模型中所有的对象。
  2. 模型中的属性。可以指定只查找某个模型的其中几个属性。(查出指定字段 等价于:select age) 只查age字段
  3. 聚合函数。
    func.count :统计行的数量。
    func.avg :求平均值。
    func.max :求最大值。
    func.min :求最小值。
    func.sum :求和。
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值