Flak模型和应用(一对一,一对多,多对多)

Flask模型类的关联(一对多/多对多)和自关联 Flask模型类的关联(一对多/多对多)和自关联​ 1 人赞同了该文章 在Flask中创建数据模型类,需要继续自flask_sqlalchemy.SQLAchemy().models.Model from flask_sqlalchemy import SQLAchemy db = SQLAchemy(flask_app).models.Model 一对多 一对多模型的实现 一对多的模型类实现可以通过db.relationship(在一的一方)和db.ForeignKey(在多的一方).. 阅读详情

数据模型

3 模型

一、模型

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,自动生成sql语句,将程序中的对象自动保存到关系数据库中。优点:

  • 隐藏了数据库访问的细节,简化了sql的使用,提高了开发效率
  • 解耦业务逻辑层(view)和数据处理层(model),简化了开发流程,提高了系统的可移植性
  • 提高了安全性

缺点:

  • 执行效率低
  • 对复杂sql无能为力
  • 增加了学习成本

SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

sqlalchemy

组成部分:

  • Engine,框架的引擎

  • Connection Pooling ,数据库连接池

  • Dialect,选择连接数据库的DB API种类

  • Schema/Types,架构和类型

  • SQL Exprression Language,SQL表达式语言

    SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作

1.1 安装

pip install pymysql
pip install flask-sqlalchemy

1.2 配置链接数据的url地址

  • mysql
#'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/python1809flask'
  • sqlite
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+os.path.join(os.getcwd(),'flask.sqlite')
  • 开启自动提交(否则为事物的提交)
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

二、设计模型

(1) 字段类型
类型python中类型说明
Integerint整形
SmallIntegerint小整形
BigIntegerint长整形
Floatfloat浮点形
Stringstring字符串
Textstring长文本
Booleanbool整形
Datedatetime.date日期
Timedatetime.time时间
DateTimedatetime.datetime日期和时间
(2) 约束条件
约束条件说明
primary_key主键
unique唯一索引
index常规索引
nullable是否可以为null 默认True
default默认值

注意:

  1. flask默认为空
  2. 设置外键不同 flask需要设置反向引用 多对多手动创建中间表
  3. flask默认开启事物 需要提交或者回滚(可以设置自动提交)
  4. 使用flask-sqlalchemy时要求每个模型都有一个主键,默认名字为id
  5. 模型类名与数据表中的名字
    • 默认:将大驼峰格式的模型类名,转换为小写加下划线格式,如:UserModel => user_model
    • 指定:__tablename__,使用此类属性指定表名

三、创建模型

(1) 创建用户模型

实例

from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy #导入ORM
from datetime import datetime
app = Flask(__name__)
#链接数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/python1809flask'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app) #实例化模型
manager = Manager(app)


#创建用户模型
class User(db.Model):
    __tablename__ = 'user' #起表名 默认是类名
    id = db.Column(db.Integer,primary_key=True) #主键
    username = db.Column(db.String(20),index=True)
    password_hash = db.Column(db.String(128))
    age = db.Column(db.Integer,default=20)
    sex = db.Column(db.Boolean,default=True)
    role = db.Column(db.Boolean,default=False) #角色(前台普通用户 还是后台管理员)
    register = db.Column(db.DateTime,default=datetime.utcnow) #注册时间
    confirm = db.Column(db.Boolean,default=False)
(2) 创建表
#创建表
@app.route('/create_all/')
def create_all():
    db.create_all()
    return 'create_all'
(3) 删除表
#删除表
@app.route('/drop_all/')
def drop_all():
    db.drop_all()
    return 'drop_all'

四、实现增删改查

(1) add 添加一条数据
#添加一条数据
@app.route('/add_one/')
def add_one():
    try:
        u = User(username='张三',password_hash='xkjbaskdadhajkdhadksjh')
        db.session.add(u) #添加一条数据
        db.session.commit() #提交
    except:
        db.session.rollback() #回滚
    return 'add_one'
(2) add_all 添加多条数据
#添加多条数据
@app.route('/add_many/')
def add_many():
    u1 = User()
    u1.username = '李四'
    u2 = User()
    u2.username = '王无'
    db.session.add_all([u1,u2])
    db.session.commit()
    return 'add_many'
(3) 修改数据
#修改
@app.route('/update/')
def update():
    u = User.query.get(1)
    u.username = '兆六'
    db.session.add(u)
    db.session.commit()
    return '修改
(4) delete 删除数据
#删除
@app.route('/delete/')
def delete():
    u = User.query.get(1)
    db.session.delete(u)
    db.session.commit()
    return '删除'
(5) 自定义一个base类 实现增删改
class DbBase:
    #添加一条数据
    def save(self):
        try:
            db.session.add(self)  # 添加一条数据
            db.session.commit()  # 提交
        except:
            db.session.rollback()
    #添加多条数据
    @staticmethod
    def save_all(*args):
        try:
            db.session.add_all(args)
            db.session.commit()
        except:
            db.session.rollback()

    # 删除一条数据
    def delete(self):
        try:
            db.session.delete(self)  # 添加一条数据
            db.session.commit()  # 提交
        except:
            db.session.rollback()

#创建用户模型
class User(db.Model,DbBase):
    ...

使用

#添加一条数据
@test.route('/add_one/')
def add_one():
    u = User(username='李四', password_hash='xkjbaskdadhajkdhadksjh')
    u.save()
    return 'add_one'

#添加多条数据
@test.route('/add_many/')
def add_many():
    u1 = User()
    u1.username = '兆六'
    u2 = User()
    u2.username = '王无'
    User.save_all(u1,u2)
    return 'add_many'

#修改
@test.route('/update/')
def update():
    u = User.query.get(1)
    u.username = '张三三'
    u.save()
    return '修改'

#删除
@test.route('/delete/')
def delete():
    u = User.query.get(1)
    u.delete()
    return '删除'

五、数据库查询

1.常见查询

方法说明
get根据主键进行查询,查到返回对象,没查到返回None
get_or_404功能同上,查不到时,直接报404错
all查询所有数据,返回一个***列表***(元素全是对象)
first返回第一条数据,没有时返回None
first_or_404功能同上,查不到时报404错
limit限制结果集数量,返回查询对象,可以继续进行链式查询操作
offset设置偏移量,返回查询对象,可以继续进行链式查询操作
order_by结果集排序,可以指定多个字段,asc升序(默认),desc降序
count统计总数
(1) all() 返回一个列表 包含所有对象
用法:类名.query.all()
      db.session.query(模型名).all()
u = User.query.all()[0:2]
u = User.query.all()
u = db.session.query(User.username,User.password).all()  #指定字段
u = db.session.query(User).all()

**注意:**不能进行链式调用 返回的不是查询集 而是列表(你只能再次使用列表的属性个方法了)

(2)first() 取出第一条数据
 data = User.query.first()
 print(data,type(data))

**注意:**取出的值为第一条数据是模型对象, 结果不可迭代

(3) get() 只能获取主键对应的数据 查询不到返回None
User.query.get(id值)
(4)字段列表
user = User.query.with_entities(User.username,User.sex).all()
user = db.session.query(User.username,User.sex).all()
(5)别名
 # 表别名
 ub = **aliased**(UserHobby,**name='ub'**)
 data = db.session.query(ub).all()
 #字段别名
 data = User.query.with_entities(User.username.**label('name')**, User.sex).all()
(6)distinct
    from sqlalchemy import distinct
    data = db.session.query(User.sex).distinct().all()
    data = db.session.query(distinct(User.sex)).all()
    data = User.query.with_entities(distinct(User.sex)).all()

2.排序

  • 默认升序/asc()

  • -降序/desc()

data = User.query.order_by(User.age).limit(1) #取出年龄最小
data = User.query.order_by(-User.age).limit(1) #取出年龄最大
data = User.query.filter().order_by(-User.username,User.sex).all()
data = User.query.filter().order_by(User.username.desc(),User.sex.asc()).all()

3.聚合函数

  • 说明:max、min、sum、avg、count
  • 示例:
from sqlalchemy import func

# 求最大值
max_age = db.session.query(func.max(User.age)).scalar()
num = db.session.query(User).count()

4.分组

  • group_by()

  • having()

  • 导入:from sqlalchemy import func

    func方法主要用来做统计,映射到sql语句中具体的统计方法,如:

    • func.count(..)
    • func.sum(..)
  num = func.count('*').label('c')
  data = db.session.query(User.sex,num).group_by(User.sex).having(num>3).all()
  data = db.session.query(User.sex,func.max(User.id).label('d')).group_by(User.sex).all()
  data = User.query.with_entities(User.sex,num).group_by(User.sex).having(num>3).all()

5. 限制

  • offset(num) 偏移num条数据

  • limit(num) 取num条数据

u = User.query.offset(4)
u = User.query.limit(4)
u = User.query.offset(1).limit(5)

6.条件查询

可以是哟filter和filter_by,ilter_by只用于单字段查询

  • 关系运算
  >,	__gt__
  >=,	__ge__
  <,	__lt__
  <=, __le__
  ==,	__eq__
  !=, __ne__
  如:
  	users = User.query.filter(User.age > 20).all()
      # 与上面等价
      users = User.query.filter(User.age.__gt__(20)).all()
  
  • contains() 包含
  u = User.query.filter(User.username.contains('5'))
  u = User.query.filter(User.username.contains('5'),User.age>70)
  • like 模糊查询

    u = User.query.filter(User.username.like('%5'))
    u = User.query.filter(User.username.like('5%'))
    u = User.query.filter(User.username.like('%5%'))
    
- startswith endswith以...开头 以...结尾

u = User.query.filter(User.username.startswith(‘李’))
u = User.query.filter(User.username.endswith(‘六’))


- in 和 not in

u = User.query.filter(User.age.in_([10,20,30,67,68]))
u = User.query.filter(~User.age.in_([10,20,30,67,68]))
u = User.query.filter(User.age.notin_([10,20,30,67,68]))
u = User.query.filter(~User.age.notin_([10,20,30,67,68]))


- 判空 is null

u = User.query.filter(User.username==None)
u = User.query.filter(User.username.is_(None))
u = User.query.filter(User.username!=None)
u = User.query.filter(User.username.isnot(None))


- filter_by() 只支持单条件查询

```python
User.query.filter_by()
User.query.filter_by(id=1)
User.query.filter_by(sex=True)
  • 逻辑运算
  from sqlalchemy import and_, or_,not_
  
  # 默认就是逻辑与
  # users = User.query.filter(User.id > 2, User.age > 20).all()
  # 与上式等价
  # users = User.query.filter(and_(User.id > 2, User.age > 20)).all()
  # 逻辑或
  users = User.query.filter(or_(User.id > 2, User.age > 20)).all()
  # 逻辑非
  u = User.query.filter(not_(User.sex==True,))

六、文件迁移

安装

  1. pip install flask-script
  2. pip install flask-migrate

实例

from flask import Flask
from flask_sqlalchemy import SQLalchemy
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand

app = Flask(__name__)
db = SQLalchemy(app) #实例化ORM模型
migrate = Migrate(app,db) #实例化迁移对象
manager = Manger(app) 
manager.add_command('db',MigrateCommand) #添加迁移命令 别名为db

迁移步骤(命令)

(1) 迁移初始化(创建迁移目录)

python manage.py db init

(2) 创建迁移文件

python manage.py db migrate

(3) 执行迁移

python manage.py db upgrade

一 模型关系

  • 一对多(使用最多)
    • 一:学生(Student)
      • 添加反向引用
    • 多:文章(Article)
      • 添加外键关联
  • 一对一
    • 一:学生(Student)
      • 添加反向引用(在一对多的基础上多添加属性:uselist=False)
    • 一:详情(Profile)
      • 添加外键关联
  • 多对多
    • 多:学生(Student)
      • 需要添加反向引用
      • 需要使用secondary指定中间关联表
      • 设置反向查询数据的加载时机,需要使用:db.backref
    • 多:课程(Course)
    • 中间关联表:此表不需要用户维护
      • 表名
      • 关联外键

http://www.pythondoc.com/flask-sqlalchemy/models.html

# 学生模型
class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20), unique=True)
    ''' 添加反向引用(无需迁移)
    参数1:关联的模型名
    backref:反向引用的字段名
    lazy:关联数据加载时机
        'select'/True:首次使用时自动查询,是默认选项
        'joined'/False:关联查询时使用
        'subquery':子查询时使用
        'dynamic':不加载数据,提供了关联数据的查询(不能用在一的一侧)
    '''
    articles = db.relationship('Article', backref='stu', lazy='dynamic')
    # 添加一对一的反向引用,需要设置:uselist=False
    profile = db.relationship('Profile', backref='stu', uselist=False)
    # 添加多对多的反向引用,需要使用secondary指定中间关联表
    courses = db.relationship('Course', secondary='xuankebiao',backref=db.backref('students', lazy='dynamic'), lazy='dynamic')

# 课程模型
class Course(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20), unique=True)


# 学生选课表(中间关联模型)
sc = db.Table('sc',
    db.Column('student_id', db.Integer, db.ForeignKey('student.id')),
    db.Column('course_id', db.Integer, db.ForeignKey('course.id'))
)
# 详情模型
class Profile(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    realname = db.Column(db.String(20), unique=True)
    # 添加关联外键
    sid = db.Column(db.Integer, db.ForeignKey('student.id'))


# 文章模型
class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(32), unique=True)
    content = db.Column(db.Text)
    # 添加外键关联,需要指定关联的'表名.字段'
    sid = db.Column(db.Integer, db.ForeignKey('student.id'))

二 模型总结

  • 关联查询

    data = db.session.query(xuankebiao).join(Student).all()
    
  • 组合查询

    data1 = Student.query.filter(Student.id == 1)
    data2 = Student.query.filter(Student.id == 2)
    data = data1.union(data2).all()
    
  • 原生sql查询

    db.session.execute("select * from student").fetchall()
    db.session.execute(‘insert into users(name) values(:value)‘,params={"value":‘wupeiqi‘})
     db.session.commit()
    

视图函数中各种关系查询

@day.route('/')
def index():

    # for i in range(10):
    #     stu = Student()
    #     stu.name = "tom" + str(randint(1,1000))
    #     stu.sex = randint(0,1)
    #     stu.sclass = "190" + str(randint(1,5))
    #     db.session.add(stu)
    #     db.session.commit()

    # 查询
    # data = Student.query.with_entities(Student.name,Student.sex).all()
    # data = Student.query.with_entities(distinct(Student.sex)).all()
    #
    # data = Student.query.order_by(-Student.sex,Student.sclass.desc()).all()
    # num = aliased(func.count('*'),name='num')
    # 字段别名
    # num = func.count('*').label('num')
    # data = Student.query.with_entities(Student.sclass,Student.sex,num).\
    #     group_by(Student.sclass,Student.sex).having(num > 1).all()
    # data = Student.query.offset(4).limit(5).all()

    # data = Student.query.filter(Student.sclass=='1903',Student.sex == 0).all()
    # data = Student.query.filter(Student.name.like('%8%')).all()
    # data = Student.query.filter(Student.sex.is_(None)).all()
    # data = Student.query.filter(Student.sex.isnot(None)).all()
    # data = Student.query.filter(Student.sex.isnot(None)).all()

    # print(data)
    # return render_template('index.html',students=data)
    return "ddd"

# 一对多查询
@day.route('/one2mul')
def oneTOMany():
    # 正向查询 学生->文章
    # 返回的是学生对象 Student
    # stu = Student.query.get(2)
    # print(stu.id)
    # data = stu.articls.filter(Article.id<4).all()
    # print(data,type(data))
    # 反向查询 文章->学生
    article = Article.query.get(4)
    # # 从文章获取所属学生的对象
    # stud是Student的对象
    data = article.stud
    # print(data)

    # 关联查询
    # data = db.session.query(Student,Article).filter(Student.id == Article.sid,Student.id==2).all()
    # print(data)
    return "one to many"

@day.route('/one2one')
def oneToOne():
    #正向查询
    # stu = Student.query.get(1)
    # print(stu.archives ,type(stu.archives))

    # 档案->学生
    arc = Archive.query.get(1)
    print(arc.stu,type(arc.stu))
    # print(Archive.query.get(1).stu)

    return "one to one"

@day.route('/m2m')
def manyToMany():
    # student->course
    # stu = Student.query.get(1)
    # data = stu.courses.all()
    # print(data,type(data))

    # course->student
    c = Course.query.get(2)
    data = c.students.all()
    # print(data)
    return "many"


# 关联查询
@day.route('/relative')
def relative_query():
    # 内连接
    # data = db.session.query(Student.name,Article.title,Article.content).filter(Student.id == Article.sid).all()

    # 返回的是Student的信息
    #select distinct student.* from student join article on student.id = sid;
    # data = db.session.query(Student).join(Article).all()
    #select distinct article.* from student join article on student.id = sid;
    # data = db.session.query(Article).join(Student).all()

    # data = Student.query.join(Article).filter(Article.id==2).all()

    # 外链接
    # data = Student.query.outerjoin(Article).all()
    # data = db.session.query(Student,Article).outerjoin().filter(Student.id == Article.sid).all()
    # data = db.session.query(Article.id,Article.title).outerjoin(Student).all()
    # print(data)

    # data1 = Student.query.filter(Student.id == 1)
    # data2 = Student.query.filter(Student.id == 2)
    # print(type(data1))
    # data = data1.union(data2).all()
    # print(data)

    # 原生sql
    data = db.session.execute("select * from student").fetchall()

    print(data)
    return "relation"

14.3、Flask数据库操作之数据库关系(一对一、一对多、多对多) 通过 SQLAlchemy,Flask 应用可以方便地定义和管理数据库关系。一对一、一对多和多对多关系的定义能够帮助我们更好地组织数据,使数据库结构更加合理。在实际开发中,合理地使用这些关系可以提高代码的可读性和可维护性。更多技术文章见公众号: 大城市小农民。 阅读详情

相关推荐

Flask-SQLAlchemy一对多&多对多查询---ORM(2)

文章目录0.背景知识1.一对多查询2.多对多查询 0.背景知识 classes表格 classID className location leader remark 21 快乐花朵班 101 小明 22 幸福宝宝班 102 花花 23 国际宝宝班 102 jack 24 艺术兴趣班 103 tony students表格 st_id name...

Alien-Hu 3276

产品经理必须懂的关系模型:一对一,一对多以及多对多关系

编辑导语:产品经理这一岗位往往需要对接多个方面,这就要求产品经理最好能懂得其他岗位的一些知识,而了解一些数据库的基本知识,则可以帮助产品经理避免描述关系的过程中存在误解。本篇文章里,作者就对产品经理需要知道的关系模型进行了总结,一起来看一下。 背景 通常会有不同的需求方给产品经理提需求,产品经理在设计功能的时候,需要将需求转换成后台可以理解的实体,并且将实体之间的关系描述给后台,因为产品大多数不懂技术,所以在描述关系的时候,可能会存在误解,所以,产品经理必须懂一些最基础的数据库知识。 数据库模型一般有“.

自学吧 3940

掌握ORM模型关系:多对一、一对一与多对多

本文深入探讨了使用SQLAlchemy ORM框架建立关系数据库中的多对一、一对一和多对多关系的方法。通过具体的代码示例和详细解释,展示了如何在Citizen与City、Country与Capital、Student与Teacher之间建立关系,以及如何更新数据库表结构而不丢失数据。

weixin_35755434的博客 1023

【译】【django】【models】模型关系:一对一,多对一,多对多

Overview1 关联关系1.1 多对一关系 - n/a1.2 多对多关系1.2.1 `ManyToManyField`1.2.2 Extra fields on many-to-many relationships1.3 一对一关系 - n/aReference - n/a 1 关联关系 1.1 多对一关系 - n/a 1.2 多对多关系 1.2.1 ManyToManyField ...

「熊猫系列项目」ing 966

OriginPro实战:5步搞定碳材料拉曼光谱D峰G峰分析(附完整数据处理流程)

本文详细介绍了使用OriginPro进行碳材料拉曼光谱D峰G峰分析的完整流程,涵盖数据预处理、多图层可视化、高精度分峰拟合等关键步骤。特别针对材料科学研究中的基线漂移、多峰重叠等问题提供专业解决方案,帮助研究者快速完成从原始数据到科研级图表的全流程分析,提升碳材料表征效率与准确性。

vodka的博客 942

西瓜书第二章——模型评估与选择(十折交叉验证/查准查全F1)

第二章——模型评估与选择

xsddys的博客 953

严格匹配_匹配理论(Matching Theory)学习笔记 一、婚姻市场

一、引言的引言作为一名以后想做经济的数学狗,作者近期学了一个月的Matching Theory(匹配理论), 为了巩固知识决定开始写这一系列的学习笔记。既是为了自用,也是想把这个有趣又切实影响着世界进步的领域安利给更多喜欢数学和经济的朋友们。虽然匹配理论在经济学五花八门的分支中并不起眼,但它对这个世界的影响却意义非凡。罗斯(Alvin Roth)运用匹配理论改进了美国许多地区的肾脏捐赠系统,将肾脏...

weixin_30160357的博客 2153

Linux下安装FastDFS及生成缩略图

1. 安装编译环境 yum install git gcc gcc-c++ make automake vim wget libevent -y 2. 安装libfastcommon基础库 mkdir /root/fastdfs cd /root/fastdfs git clone https://github.com/happyfish100/libfastcommon.git --depth 1 cd libfastcommon/ ./make.sh && ./make.sh ins

weixin_45234710的博客 1374

flask模型建立

flask 模型建立 定义表类中的 表名要使用 __tablename__注意是双下划线 #from flask import Flask 1. 导入sqlachemy类 from flask_sqlalchemy import SQLAlchemy 2. 配置数据库的连接 app=Flask(__name__) #指定连接的数据库,数据库需手动创建 app.config['SQLALCHEM...

weixin_43854747的博客 477

MONAI教程<1>-安装

MONAI的安装非常简单,常用的有两种方法: 直接 pip install monai 从GitHub 上安装 monai是通常配合其他库一起使用的,比如pytorch, nibabel, skimage, pillow等等。缺什么直接pip install 就行

Tina姐的博客 1万+

验证码破解2.0:Python+CV大模型搞定滑块/点选验证

核心创新:基于YOLOv8+SAM CV大模型的端到端验证码破解方案,无需人工设计特征,适配多种验证码类型;核心价值高成功率:滑块验证≥95%,点选验证≥90%,远超传统CV方案;低延迟:单验证码破解≤2秒,满足高并发采集需求;行为模拟:生成符合人类操作的轨迹,绕过行为检测;易扩展:统一架构支持新增验证码类型,仅需少量标注数据微调;技术要点采用YOLOv8实现快速目标检测,SAM实现像素级分割;生成物理规律的人类轨迹,模拟真实操作行为;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1261

什么是星型模型和雪花型模型,以及区别。

一直觉得星型和雪花型差不多,今天特意去网上搜了一下,看到一篇说的特别好的文章转发过来大家共同学一下。 一、概述 在多维分析的商业智能解决方案中,根据事实表和维度表的关系,又可将常见的模型分为星型模型和雪花型模型。在设计逻辑型数据的模型的时候,就应考虑数据是按照星型模型还是雪花型模型进行组织。 当所有维表都直接连接到“事实表”上时,整个图解就像星星一样,故将该模型称为星型模型,如图 1 。 ...

mojolang 6875

【AI面试】 Python 的装饰器

Python装饰器是一种高阶函数,用于在不修改原函数代码的情况下增强其功能。它通过@语法糖接收目标函数作为参数,并返回一个包含额外逻辑(如日志、缓存、权限验证等)的新函数。装饰器的核心价值在于代码复用和解耦,符合开闭原则,典型应用包括性能分析、权限控制等场景。例如,@timer_decorator可自动为函数添加耗时统计功能。本质上,@decorator等价于func = decorator(func),实际调用的是装饰器返回的包装函数。进阶技巧包括使用@functools.wraps保留原函数元信息。装饰

钱多多先森 184

flask 一对一,一对多,多对多

先进行如下操作: from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app=Flask(__name__) db=SQLAlchemy(app) 一对多: class Parent(db.Model): id=db.Column(db.Integer,primary_key=True)...

yournevermore的博客 753

C#构建高精度预测模型:从数据预处理到模型部署的实战指南

【代码】C#构建高精度预测模型:从数据预处理到模型部署的实战指南。

墨夶的博客 1263

innovus中如何设置cts参数

上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。

芯冰乐 544

Flask-sqlalchemy一对多,多对一,一对一,多对多

flask-sqlalchemy 一对多,多对多,一对一

weixin_42576837的博客 1458

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Flask-SQLAlchemy查询方法汇总 - 表间查询 一对一、一对多、多对多

1. 一对一 参考一对多的例子,下添加uselist=False就变成了一对一。 # 添加一对一的反向引用,在一对多的情况下添加uselist=False就变成了一对一 rank_related_score = db.relationship('tbl_2018_data', backref = 'score_related_rank', uselist=False) ...

steventian72的博客 2447

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

flask一对一、一对多和多对多关系

一对一关系 一对一关系加字段 一对多关系 初始设置 import os from flask import Flask from flask_sqlalchemy import SQLAlchemy import pymysql app = Flask(__name__) # app.config返回类字典对象,里面用来存放 BASE_DIR = os.path.abspath(...

qq_39112101的博客 812

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

flask中的orm关系模型,一对一模型,一对多模型,多对多模型,多对多自关联模型

ORM 全拼 Object-Relation Mapping. 中文意为 对象-关系映射. 主要实现模型对象到关系数据库数据的映射. 和Java中的JDBC 有异曲同工之处 优点 通过改变数据库模型改变表结构 通过模型类进行数据库的增删改查操作. 只需要面向对象编程, 不需要面向数据库编写代码. 对数据库的操作都转化成对类属性和方法的操作. 不用编写各种数据库的sql语句. 实现了数据模...

qq_36622490的博客 1499

7、flask创建一对一关系,一对多,多对多,关系表

创建flask一对一关系表 from flask import Flask,render_template from flask_sqlalchemy import SQLAlchemy import os app = Flask(__name__) db = SQLAlchemy(app) #配置-项目的根路径 BASE_DIR = os.path.dirname(os.path.abspat...

panjunxiao的博客 764

Flask04-模型的一对一,一对多,多对多

1. 一对一关系主要通过一个 uselist=False 来约束, 因为在一对多中通过 查询得到的是一个列表, 所以, uselist=False禁用列表, 使我们只能查找到一个, 就构成了一对一关系人和身份证的一对一一关系 ​ from flask_sqlalchemy import SQLAlchemy ​ db = SQLAlchemy() ​ class Pe...

zhang_Ming_lu的博客 4万+

ORM模型的CRUD操作以及一对多/多对多的关系

高级操作比如外连接,子查询,嵌套查询等等还没学,等到学习的时候再来完善.

qq_46680395的博客 1867

flask-sqlalchemy 一对一,一对多,多对多操作

先进行如下操作: from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app=Flask(__name__) db=SQLAlchemy(app) 一对多: class Parent(db.Model): id=db.Column(db.Integer,primary_key=Tru...

aobian2884的博客 440

Flask中的一对多和多对多

1.ForeignKey class Students(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) s_name = db.Column(db.String(20), unique=False, nullable=False) s_age = db.Column(db.Integer, default=18) s_g = db.Column(db.Integer, db

BigData_Mining的博客 837

Flask 数据库 一对多 多对多

Flask 数据库 一对多 多对多 app.py import os from flask import Flask # 引入表格模块 from flask_sqlalchemy import SQLAlchemy #导入pymysql import pymysql #用pymysql 代替 MySqldb pymysql.install_as_MySQLdb() app=Flask(__name__) # 获取文件路径 BASE_DIR=os.path.abspath(os.path.dirname(_

a1309525802的博客 3378
上一篇: Flask实现Json数据存库和收藏功能
下一篇: Flak配置缓存
Are you ready
博客等级 码龄8年 312粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值