,并不是以数据库模型名称命名 # ihome -> ih_user 数据库名缩写_表名 # tbl_user tbl_表名 # 创建数据库sqlalchemy工具对象 db...关联表connections就是一个简单的表,不是模型,SQLAlchemy会自动接管这个表。...自引用关系 多对多关系在我们的Web应用中可以用来实现用户之间的关注,但是在上面的文章和标签的例子中,关联表连接的是两个明确的实体,而在用户关注其他用户时,都在users表内,只有一个实体。...这种信息只能存储在关联表中,但是在之前实现的学生和课程之间的关系中,关联表完全是由SQLAlchemy掌控的内部表。...删除对象时,默认的层叠行为是把对象联接的所有相关对象的外键设为空值。但在关联表中,删除记录后正确的行为应该是把指向该记录的实体也删除,因为这样能有效销毁联接。
查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 首发时间:2018-02-24 23:59 修改: 2018-06-15,发现自己关于pymysql写了对于数据的操作示例,但没有写表结构的示例...,而这个类存在与表相映射的属性,那么可以通过操作这个类来创建一个表】 sqlmary是一个mysql的ORM 前提: 安装模块:pip3 install sqlalchemy 使用: 导入模块: 导入连接数据库模块...tablename__来定义表名 使用 列名 = Column(数据类型,其他列属性…)等类似格式来定义字段 nullable=False 代表这一列不可以为空,index=True 表示在该列创建索...relationshop能被两个表使用,另一个表使用backref来获取相关信息 relationship中的foreign_keys的用途:当有多个relationship时,为了避免ORM混淆多个...以一个老师能做一个班的班主任此外还能做另一个班的副班主任为例【即一个老师能对应多个班级】 一对多关系的创建的核心是relationship中的foreign_keys 附:当你建表成功而插入数据失败时
: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。 多表查询 上面例子中的2个表,要输出一张考勤表,但是考勤表中没有name字段。...data就是对象 print(type(data)) # 这里data是对象,没有len print(data.id, data.name, data.age) # 直接打印data的属性 print...student表创建时用了无符号的数字这个数据类型,所以创建的新表的类型也得一致,要使用这个类型就得导入 from sqlalchemy.dialects.mysql import INTEGER 。...,相当于另一张表的对象就是这张表中的一个属性。...有外键约束,其中一张表一定是所有的属性值都被另外一张表包含的。 上面是查询,还可以通过关联对象来创建。
utf-8创建表时铁定报错,需要写成charset=utf8);echo=True用于显示SQLalchemy在操作数据库时所执行的SQL语句情况,相当于一个监视器,可以清楚的知道执行情况;pool_size...当执行创建数据表的命令时报错了,“ AttributeError: 'NoneType' object has no attribute 'encoding' ”看到这个应该是字符串的问题,一边去找报错的...但是当第二次使用上面语法创建时已经关闭了以上窗口,重新连接数据库,创建myclass表时会报错:“NameError: name 'mytable' is not defined”,无奈,只能重新执行上面步骤...当建立好表关系后,需要将数据插入到表中,对其进行相关的操作前,需要创建一个会话对象用于执行SQL语句,所用代码如下。 ?...引入sessionmaker模块,指定绑定已连接数据库的engine对象,生成会话对象session,该对象用于数据库的增、删、改、查。那么创建表添加数据的语法如下。 ?
特点是操纵Python对象而不是SQL查询,也就是在代码层面考虑的是对象,而不是SQL,体现的是一种程序化思维,这样使得Python程序更加简洁易读。...创建好了Engine的同时,Pool和Dialect也已经创建好了,但是此时并没有真正与数据库连接,等到执行具体的语句.connect()等时才会连接到数据库。...创建数据库表类(模型) 前面有提到ORM的重要特点,那么我们操作表的时候就需要通过操作对象来实现,现在我们来创建一个类,以常见的用户表举例: from sqlalchemy.ext.declarative...Q1:add之后如何直接返回对象的属性? 可以在add之后执行db.session.flush(),这样便可在session中get到对象的属性。 Q2:如何进行批量插入,性能比较?...,此时还没有去具体的数据库中查询,只有当执行具体的.all(),.first()等函数时才会真的去操作数据库。
SQLAlchemy是一个基于Python的ORM框架。该框架是建立在DB-API之上,使用关系对象映射进行数据库操作。...在没有DB-API之前,各数据库之间的应用接口非常混乱,实现各不相同, 项目需要更换数据库的时候,需要做大量的修改,非常不方便,DB-API就是为了解决这样的问题。...单表的创建 app.py from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base...,要关联它的别名,关联id 创建爱好表 class Hobby(Base): tablename = 'hobby' id = Column(Integer, primary_key=True)...元组里是两个对象 ret16 = session.query(app1.Student).join(app1.Classes).all() print(ret16[2].username) # 得到列表里面是前一个表的对象
在 Flask-SQLAlchemy 中,指定查询条件是通过数据对象的 query 对象来实现的,query 对象中实现了很多常用的过滤方法,可以方便地实现过滤查询。 一、准备数据库和数据表 1....二、在数据表中批量插入数据 因为相同的代码在之前已经使用过,所以在准备数据表时,先将数据表删除了,重新建新的表。数据表是空,要查询数据,数据表中首先要有数据,先批量添加数据到数据表中。...[Phone_name: IPhone, Phone_name: Mi, Phone_name: HUAWEI] 四、Flask-SQLAlchemy 关系字段和关联查询 在上面创建的两张表中,已经设置了关系字段...第二个参数 backref 是在模型类 Person 中申明一条新属性的方法,这个属性名是通过关系字段查询数据时使用的属性。...在数据表中,不会创建这个字段(也可以说是隐藏字段),但是这个属性名不能与 Person 中已有的属性同名,否则属性冲突,在数据表中添加数据时会报错。
员工表需要添加员工ID作为主键 工资表用哪个作为主键都不合适,可以单独添加一个id作为主键 第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。...创建用于操作数据库(表)的游标,相当于操作文件时打开的文件对象 通过游标执行sql语句 如果涉及对数据库的修改,需要执行commit 关闭游标、关闭连接 # 创建数据库 MariaDB [(none)...sqlalchemy_pkgs/SQLAlchemy-1.2.14.tar.gz ORM:对象关系映射 Object:对象,对应python的class Relationship:关系,对应关系型数据库...Mapping:映射 把sqlalchemy中的类与表关联 把类中的变量与表的字段关联 把类的实例与表的记录关联 表中的每个字段与sqlalchemy的Column类关联 字段的类型与sqlalchemy...相关的类关联 MariaDB [nsd1903]> CREATE DATABASE tedu1903 DEFAULT CHARSET utf8; 对数据库执行增删改查操作时,需要创建会话。
三、创建测试数据库 创建一个用于测试的数据库 其中sqlalchemydb就是测试数据库 四、封装SQLAlchemyDB类 在python项目根目录下创建一个sqlalchemy_db.py...() 会将我们的模型自动映射到数据库中,当然也可以手动去数据库中创建表 说明3:我们写好的这个model类暂时还没有使用呢 。...说明2:money字段总长度时9位,但是可以少于9位,不能多于9位,小数部位不足时补0 7.2 批量添加数据 再来演示一下批量增加数据,代码如下还是在test.py中 执行后的结果如下...再来测试一下删除数据 可以看出,数据库中已经没有id=1的数据了 九、查询 在进行查询测试之前,先往数据库中添加一下测试数据 9.1 query关键字 在做查询的时候我们通常...query关键字,它类似于SQL中select 关键字,query参数通常可以填写三类参数 model模型对象:指定查找这个模型中所有的字段 model模型对象中的属性:可以指定只查找某个model中的几个属性字段
三、SQLAlchemy ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。 在Python中,最有名的ORM框架是SQLAlchemy。...创建的user表 #导入 from sqlalchemy import Column, String, create_engine, ForeignKey from sqlalchemy.orm import...由于有了ORM,向数据库表中添加一行记录,可以视为添加一个User对象 #创建session对象 session =DBSsession() #创建新User对象 new_user = User(id=...(user)) print('name:', user.name) # 关闭Session: session.close() 由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多...User表 user_id = Column(String(20), ForeignKey('user.id')) 当我们查询一个User对象时,该对象的books属性将返回一个包含若干个Book
不过学习本课程时并不需要这么做,在创建数据库的同时添加 CHARACTER SET = UTF8 指定编码格式即可。...创建声明基类时传入引擎 Base = declarative_base(engine) 创建映射类须继承声明基类。...首先创建 user 数据表的映射类,此表存放用户数据,也就是课程作者的数据: Column 定义字段,Integer、String 分别为整数和字符串数据类型 from sqlalchemy import...user = User(name=fake.name(), email=fake.email()) # 将实例添加到 session 会话中,以备提交到数据库 # 注意,此时的 user 对象没有...id 属性值 # 映射类的主键字段默认从 1 开始自增,在传入 session 时自动添加该属性值 session.add(user) def create_courses(): #
pymysql sqlalchemy 先安装两个库: pip install pymysql pip install sqlalchemy 本地数据库 查看一个本地数据库中某个表的数据。...,在连接没有关闭之前,游标对象可以反复使用 执行sql查询语句 In [3]: sql=""" # 待执行的sql语句 select * from Student; """ # 执行sql语句 cur.execute...主要返回游标的属性信息,官网的描述为: Out[5]: (('s_id', 253, None, 20, 20, 0, False), ('s_name', 253, None, 20, 20, 0...通过游标获取查询的结果集的特点: 可以获取1条、多条和全部数据 在获取数据的时候是按照顺序读取的 fetchall函数返回剩下的所有行 如果是末尾,则返回空元组; 否则返回一个元组,其元素是每一行的记录封装的一个元组...中: show tables; 使用read_sql读取 使用Pandas自带的read_sql函数能够自行读取数据,读取上面创建的数据: import pandas as pd from sqlalchemy
当基于此基类,创建 Python 类时,就会自动映射到相应的数据库表上。...运行程序,程序不会有输出信息,但是 sqlalchemy 已经在 MySQL 数据库里面为我们创建了 users 表。...创建的 articles 表有外键 userid, 在 SQLAlchemy 中可以使用 ForeignKey 设置外键。...需要注意的地方是定义 users 属性时,使用了 relationship 的 backref 参数,该参数使得可以在 UserInfo 实例中,通过 userinfos.user 访问关联的所有用户信息...是 sqlalchemy.schema.MetaData 对象,表示所有 Table 对象集合, create_all() 会触发 CREATE TABLE 语句创建所有的表。
sqlalchemy基础操作 ORM操作在实际项目中的应用非常多,涉及到的框架也是根据不同的项目有不同的处理模块,不过操作流程和步骤都是大同小异基本没有什么太大变化,唯一需要注意的就是在实际操作过程中你要使用的...ORM之Object操作 我们的程序中的对象要使用sqlalchemy的管理,实现对象的orm操作,就需要按照框架指定的方式进行类型的创建操作,sqlalchemy封装了基础类的声明操作和字段属性的定义限制方式...): # 定义和指定数据库表之间的关联 __tabelname__ = “user” # 创建字段类型 id = Column(Integer, primary_key=...确定和数据库中某个数据表之间的关联关系,指定某列类型为primary_key设定的主键,其他就是通过Column指定的自定义属性了。...,该操作会检查目标数据库中是否有需要创建的表,不存在的情况下创建对应的表 ..
帮你把返回的数据映射成一个对象啦,这样你调用每个字段就可以跟调用对象属性一样。...不过刚才上面的显示的内存对象对址你是没办法分清返回的是什么数据的,除非打印具体字段看一下,如果想让它变的可读,只需在定义表的类下面加上这样的代码 1 def __repr__(self): 2...我们创建一个addresses表,跟user表关联 一个人有多个邮箱地址,或者说多个邮箱地址对应同一个人。...36 # 功能1 相当于给Address这个表添加了一个属性列user,查询时可以用.user得到对应的User对象。但是这列不能插入数据,仅用于查询。...37 # 功能2 相当于给User这个表添加了一个属性列add,查询时在user表中可以通过.add得到Address对象。
SQLAlchemy提供了一个relationship,这个类可以定义属性,以后在访问相关联的表的时候就直接可以通过属性访问的方式就可以访问得到了。...父删子删 delete-orphan:表示当对一个ORM对象解除了父表中的关联对象的时候,自己便会被删除掉。当然如果父表中的数据被删除,自己也会被删除。...当在使用session.merge,合并一个对象的时候,会将使用了relationship相关联的对象也进行merge操作。 expunge:移除操作的时候,会将相关联的对象也进行移除。...这种对象既可以添加新数据,也可以跟Query一样,可以再进行一层过滤。 总而言之一句话:如果你在获取数据的时候,想要对数据再进行一层过滤时,可以考虑使用lazy='dynamic'。...如果你没有访问user.articles这个属性,那么sqlalchemy就不会从数据库中查找文章。
一对多 class Role(db.Model): # 定义表名,如果未定义,默认创建同类名的表名 __tablename__ = 'roles' # 定义列对象 id...,如果未定义,默认创建同类名的表名 realtionship 描述了Role和User的关系,第一个参数为对应参照的类名(一方的类名) 第二个参数backref 为类USer申明新属性的方法 第三个参数...lazy 决定了什么时候SQLAlchemy 从数据库中加载数据 如果设置为子查询方式(subquery),则会在加载完Role对象后,就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多...,就会比较慢 设置为 subquery 的话,role.users 返回所有数据列表 另外,也可以设置为动态方式(dynamic),这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多...,它包含指定范围内的结果 paginate 方法详解 # page 为当前页 # per_page 每页显示的记录数量 # Flase 没有记录时不报错 paginate = paginate(
使用蓝图 Blueprint对象用起来和一个应用/Flask对象差不多,最大的区别在于一个 蓝图对象没有办法独立运行,必须将它注册到一个应用对象上才能生效 使用蓝图可以分为四个步骤 1,创建一个蓝图目录...- 当在应用对象上调用 route 装饰器注册路由时,这个操作将修改对象的url_map路由表 - 然而,蓝图对象根本没有路由表,当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表..., 即调用应用对象的 add_url_rule() 方法,这将真正的修改应用对象的路由表 3,蓝图的url前缀 - 当我们在应用对象上注册一个蓝图时,可以指定一个url_prefix关键字参数(这个参数默认是...需要我们在 创建时指定 static_folder 参数。...,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录 admin = Blueprint('admin',__name__,template_folder='my_templates
主要实现模型对象到关系数据库数据的映射 优点 : 只需要面向对象编程, 不需要面向数据库编写代码. 对数据库的操作都转化成对类属性和方法的操作. 不用编写各种数据库的sql语句....secondary join 在SQLAlchemy中无法自行决定时,指定多对多关系中的二级连表条件 数据库基本操作 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。...在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提交会话。 在 Flask-SQLAlchemy 中,查询操作是通过 query 对象操作数据。...另外,也可以设置为动态方式(dynamic),这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式 设置为 dynamic 的话...存储session的基本配置 需要手动创建session表,在项目第一次启动的时候,使用db.create_all()来完成创建。
在上一篇我们定义了一个登陆页面,但是对于登陆我们并没有校验,当然也没有保存任何用户信息,现在我们来完善登陆注册功能。...定义表结构 首先我们定义用户表的表结构,为了方便起见,我们使用插件 flask_login 来进行用户鉴权,在 app.py 文件中添加如下代码 from flask_sqlalchemy import...import UserMixin, login_user import hashlib db = SQLAlchemy(app) # 用户表结构 class WebUser(UserMixin...() 创建数据库表 >>> from app import db >>> db.create_all() 如果不出意外,此时当前目录下应该会生成一个 myweb.sqlite 文件。...LoginManager 对象的 session_protection 属性可以设为 None、'basic' 或 'strong',以提供不同的安全等级,防止用户会话遭篡改。
领取专属 10元无门槛券
手把手带您无忧上云