资讯专栏INFORMATION COLUMN

SQLAlchemy

stonezhu / 1340人阅读

摘要:首先安装包数据库的默认编码为,修改数据表的默认编码是的一个基本操作,这是需要预先掌握的。生成测试数据接下来创建个课程作者,也就是个类的实例,每个作者对应两个课程,共个类实例。

首先安装包
sudo pip3 install sqlalchemy

数据库的默认编码为 latin1,修改数据表的默认编码是 MySQL 的一个基本操作,这是需要预先掌握的。不过学习本课程时并不需要这么做,在创建数据库的同时添加 CHARACTER SET = UTF8 指定编码格式即可。我们要创建课程相关的映射类以及对应的数据表,现在先创建所需数据库 study ,编码格式为 UTF-8 :

mysql -u root
create database study character set = UTF8;
show create database studyG

使用 SQLAlchemy 连接数据库需要引擎,创建引擎使用 create_engine 方法:

from sqlalchemy import create_engine

参数字符串说明:数据库类型+驱动://用户名:密码@主机:端口号/数据库名字?charset=编码格式 mysql 自带驱动,密码未设定,端口号可省略

engine = create_engine("mysql://root@localhost/study?charset=utf8")
创建映射类需要继承声明基类,使用 declarative_base :

from sqlalchemy.ext.declarative import declarative_base

创建声明基类时传入引擎

Base = declarative_base(engine)

创建映射类须继承声明基类。首先创建 user 数据表的映射类,此表存放用户数据,也就是课程作者的数据:

Column 定义字段,Integer、String 分别为整数和字符串数据类型

from sqlalchemy import Column, Integer, String

class User(Base): # 继承声明基类

__tablename__ = "user"  # 设置数据表名字,不可省略
id = Column(Integer, primary_key=True)   # 设置该字段为主键
# unique 设置唯一约束,nullable 设置非空约束
name = Column(String(64), unique=True, nullable=False)
email = Column(String(64), unique=True)

# 此特殊方法定义实例的打印样式
def __repr__(self):
    return "".format(self.name)

一对多关系
现在创建第二个映射类 Course,它对应的数据表 course 存放课程数据。一个课程作者可以创建多个课程,一个课程对应唯一的课程作者,这种关系被称为一对多或者多对一关系,这是最常用的数据表关系类型:

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship, backref

class Course(Base):

__tablename__ = "course"
id = Column(Integer, primary_key=True)
name = Column(String(64))
# ForeignKey 设置外键关联,第一个参数为字符串,user 为数据表名,id 为字段名
# 第二个参数 ondelete 设置删除 User 实例后对关联的 Course 实例的处理规则
# "CASCADE" 表示级联删除,删除用户实例后,对应的课程实例也会被连带删除
user_id = Column(Integer, ForeignKey("user.id", ondelete="CASCADE"))
# relationship 设置查询接口,以便后期进行数据库查询操作
# 第一个参数为位置参数,参数值为外键关联的映射类名,数据类型为字符串
# 第二个参数 backref 设置反向查询接口
# backref 的第一个参数 "course" 为查询属性,User 实例使用该属性可以获得相关课程实例的列表
# backref 的第二个参数 cascade 如此设置即可实现 Python 语句删除用户数据时级联删除课程数据
user = relationship("User", 
        backref=backref("course", cascade="all, delete-orphan"))

def __repr__(self):
    return "".format(self.name)
    
    

创建数据表
声明基类 Base 在创建之后并不会主动连接数据库,因为它的默认设置为惰性模式。Base 的 metadata 有个 create_all 方法,执行此方法会主动连接数据库并创建全部数据表,完成之后自动断开与数据库的连接:

Base.metadata.create_all()

完整代码
总结以上内容,写入 db.py 文件:

File Name:db.py

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref

engine = create_engine("mysql://root@localhost/study?charset=utf8")
Base = declarative_base(engine)

class User(Base):

__tablename__ = "user"  
id = Column(Integer, primary_key=True) 
name = Column(String(64), unique=True, nullable=False)
email = Column(String(64), unique=True)

def __repr__(self):
    return "".format(self.name)

class Course(Base):

__tablename__ = "course"
id = Column(Integer, primary_key=True)
name = Column(String(64))
user_id = Column(Integer, ForeignKey("user.id", ondelete="CASCADE"))
user = relationship("User",
        backref=backref("course", cascade="all, delete-orphan"))

def __repr__(self):
    return "".format(self.name)

if name == "__main__":

# 使用声明基类的 metadata 对象的 create_all 方法创建数据表:
Base.metadata.create_all()

运行程序
在终端使用 Python 解释器运行文件,在此之前先安装一个必要的依赖包 mysqlclient,该依赖包的作用是连接数据库:

$ sudo pip3 install mysqlclient # 安装依赖包
$ python3 db.py

测试数据的创建需要用到 Python 的 faker 库,使用 pip3 安装先:

sudo pip3 install faker
这是一个用法简单功能强大的伪造数据的库,大家可以在命令行交互解释器 ipython 中进行测试,首先在终端命令行安装 ipython :

$ sudo pip3 install ipython

完成后终端执行 ipython 命令,即可进入命令行交互解释器:

In [38]: from faker import Faker # 引入 Faker 类

创建实例,添加参数 "zh-cn" 是为了伪造中文数据 该实例叫做工厂对象,它可以使用各种各样的方法伪造数据

In [39]: fake = Faker("zh-cn")

In [40]: fake.name() # 伪造姓名
Out[40]: "房明"

In [41]: fake.address() # 伪造地址
Out[41]: "山西省梅市上街董路Q座 238175"

In [42]: fake.email() # 伪造邮箱
Out[42]: "oqiu@rn.net"

In [43]: fake.url() # 伪造 URL
Out[43]: "https://www.yuzhu.cn/"

In [44]: fake.date() # 伪造日期
Out[44]: "2012-07-03"

ession 处理数据
上文已经介绍了使用映射类创建数据表要用声明基类 Base,那么处理数据用什么呢?要用到 session,它是 sessionmaker 类的实例,该实例实现了 call 方法,本身可以作为函数来执行,返回值就是能够处理数据的 session:

from sqlalchemy.orm import sessionmaker

从 db.py 文件中引入下列对象备用

from db import Base, engine, User, Course

将 engine 引擎作为参数创建 session 实例

session = sessionmaker(engine)()
当我们创建了 session 实例,就启动了一个操作 MySQL 数据库的会话。

生成测试数据
接下来创建 5 个课程作者,也就是 5 个 User 类的实例,每个作者对应两个课程,共 10 个 Course 类实例。将以下代码写入测试数据的 Python 文件中,文件名为 create_data.py :

File Name: create_data.py

from sqlalchemy.orm import sessionmaker
from faker import Faker
from db import Base, engine, User, Course

session = sessionmaker(engine)()
fake = Faker("zh-cn")

def create_users():

for i in range(10):
    # 创建 10 个 User 类实例,伪造 name 和 email
    user = User(name=fake.name(), email=fake.email())
    # 将实例添加到 session 会话中,以备提交到数据库
    # 注意,此时的 user 对象没有 id 属性值
    # 映射类的主键字段默认从 1 开始自增,在传入 session 时自动添加该属性值
    session.add(user)

def create_courses():

# session 有个 query 方法用来查询数据,参数为映射类的类名
# all 方法表示查询全部,这里也可以省略不写
# user 就是上一个函数 create_users 中的 user 对象
for user in session.query(User).all():
    # 两次循环,对每个作者创建两个课程
    for i in range(2):
        # 创建课程实例,name 的值为 8 个随机汉字
        course = Course(name="".join(fake.words(4)), user_id=user.id)
        session.add(course)

def main():

# 执行两个创建实例的函数,session 会话内就有了这些实例
create_users()
create_courses()
# 执行 session 的 commit 方法将全部数据提交到对应的数据表中
session.commit()

if name == "__main__":

main()

完成后,可以在终端执行 python3 create_data.py 来创建数据。为了便于查看代码的执行情况,不这样做,我们在 ipython 中引入这些函数,依次执行它们来查看细节:

引入相关对象

In [1]: from create_data import User, Course, session, create_users, create_courses

执行创建 User 实例的函数

In [2]: create_users()

session 查询结果为列表,每个元素就是一个 User 实例

In [3]: session.query(User).all()
Out[3]:
[,
,
,
,
,
,
,
,
,
]

将某个 User 实例赋值给 user 变量

In [4]: user = session.query(User).all()[3]

查看属性

In [5]: user.name
Out[5]: "邢想"

In [6]: user.id
Out[6]: 4

执行创建 Course 实例的函数

In [7]: create_courses()

查看前 4 个 Course 实例的 name 属性

In [8]: for course in session.query(Course)[:4]:
...: print(course.name)
...:
开发中文电子新闻
怎么发布结果详细
你的只要非常如果
次数通过评论等级

User 实例的 course 属性为查询接口,通过 relationship 设置 属性值为列表,里面是两个课程实例

In [9]: user.course
Out[9]: [, ]

将某个课程实例赋值给 course 变量

In [10]: course = session.query(Course)[12]

课程实例的 user 属性为查询接口,通过 relationship 设置

In [11]: course.user
Out[11]:

将全部实例提交到对应的数据表

In [12]: session.commit()

**接下来我们在 ipython 中删除 user 实例,验证级联删除功能是否生效:

In [13]: session.delete(user)

In [14]: session.commit()**

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44006.html

相关文章

  • 通过demo学习OpenStack开发所需的基础知识 -- 数据库(1)

    摘要:另外,项目在单元测试中使用的是的内存数据库,这样开发者运行单元测试的时候不需要安装和配置复杂的数据库,只要安装好就可以了。而且,数据库是保存在内存中的,会提高单元测试的速度。是实现层的基础。项目一般会使用数据库来运行单元测试。 OpenStack中的关系型数据库应用 OpenStack中的数据库应用主要是关系型数据库,主要使用的是MySQL数据库。当然也有一些NoSQL的应用,比如Ce...

    warnerwu 评论0 收藏0
  • 深入理解flask框架(3):config与extension

    摘要:中的配置,都是通过来控制那么究竟是什么再来看函数而是什么再转向看的源码,可以看到类继承于字典也就是说的就是一个特殊的字典,用于保存配置项。 config flask中的配置,都是通过config来控制那么config究竟是什么? self.config = self.make_config(instance_relative_config) 再来看make_config函数: def ...

    wmui 评论0 收藏0
  • Flask-SQLAlchemy 学习总结

    摘要:初始化和配置对象关系映射。的则需要在中声明。例如配置信息中指出是可以绑定多个数据库引擎。是通过解决一对多的关系。将会返回学院学生人数将会返回学生的学院信息的类实例。处理关系对象查询中有详细的说明。 初始化和配置 ORM(Object Relational Mapper) 对象关系映射。指将面对对象得方法映射到数据库中的关系对象中。Flask-SQLAlchemy是一个Flask扩展,能...

    whataa 评论0 收藏0
  • flask笔记:是flask.ext.sqlalchemy还是flask_sqlalchemy

    摘要:首先出结论,和是一个意思,区别是写法不同,兼容性不同。是特有的拓展功能,目前,扩展必须支持以及原因扩展导入转换我们推荐使用扩展的命名空间包。相反,我们现在推荐命名软件包,而不是现在已弃用的。 最近入门python的flask框架,官方推荐用sqlalchemy库作为与数据库交互的工具。这时我在看网络上一些文章资料时发现一个问题。 这里插个题外话,sqlalchemy和flask_sql...

    DandJ 评论0 收藏0
  • Python-SQLAlchemy:第1节:SQLAlchemy入门

    摘要:下一篇文章第节查询条件设置是编程语言下的一款开源软件。提供了工具包及对象关系映射工具,使用许可证发行。在关闭连接时会自动进行事务提交操作。引入多条件查询时使用。由于上下文函数退出时会自动提交事务,所以无需显示的调用使新增生效。 下一篇文章:Python-SQLAlchemy:第2节:查询条件设置 SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系...

    noONE 评论0 收藏0
  • Flask扩展之flask-sqlalchemy(上)

    摘要:查询记录在调试或测试模式自动启用。可以用于显式禁用原生支持。当使用不合适的指定无编码的数据库默认值时,这对于一些数据库适配器是必须的比如上某些版本的。这对是必要的,它默认移除闲置多于小时的连接。注意如果使用了,自动设定这个值为小时。 flask-sqlalchemy是flask的一个ORM扩展框架,这个扩展在sqlalchemy的进行的扩展,更方便的结合Flask.什么是ORM?其是O...

    KaltZK 评论0 收藏0

发表评论

0条评论

stonezhu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<