在本文你会看到

  1. 怎么配置一对一映射
  2. 怎么使用一对一数据
  3. 怎么配置一对多映射
  4. 怎么使用一对多数据
  5. 怎么配置多对多映射
  6. 怎么使用多对多数据

开始

最近再用Flask来做一个博客,在用SQLAlchemy进行配置数据库的时候发现了问题,网上的博客和官方文档都只是讲了一点,自己跟着做怎么也实现不了,最后通过找了好几个不同的博客终于写出来,想记录一下整个过程

怎么配置一对一映射

一对一映射是里面最简单的映射,我们先创建数据库,这里我用的是sqlite数据库

CREATE TABLE POST (ID INTEGER PRIMARY KEY AUTOINCREMENT,TITLE TEXT NOT NULL,BODY TEXT NOT NULL,UP_DATE DATETIME NOT NULL,CLICKED INTEGER NOT NULL,);
复制代码

数据库创建好后在程序里面创建一个映射数据的类

class Post(db.Model):__tablename__ = "post"id = db.Column(db.Integer, primary_key=True, autoincrement=True)title = db.Column(db.String(80))body = db.Column(db.Text)up_date = db.Column(db.DateTime)clicked = db.Column(db.Integer)def __init__(self, title, body, clicked, up_date=None):self.title = titleself.body = bodyif up_date is None:up_date = datetime.utcnow()self.up_date = up_dateself.clicked = clickeddef __repr__(self):return '<Post %r>' % self.title
复制代码

创建好了对象就完成了映射下面开始使用了

怎么使用一对一数据

通过POST请求获得数据然后存储到数据库中

        title = request.form.get("title")content = request.form.get("content")p = Post(title, content, 0)db.session.add(p)db.session.commit()
复制代码

与增相似,只不过把db.session.add()改成db.session.delete()

在创建对象时需要继承db.model,SQLalchemy就可以使用对象中的query方法了

 Post.query.all()
复制代码

查询所有数据 SQLAlchemy ORM教程之二:Query这里面有其他查询的方法

怎么配置一对多映射

先是创建数据库

CREATE TABLE POST (ID INTEGER PRIMARY KEY AUTOINCREMENT,TITLE TEXT NOT NULL,BODY TEXT NOT NULL,UP_DATE DATETIME NOT NULL,CLICKED INTEGER NOT NULL,CATEGORY_ID INTEGER NOT NULL ,FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORY(ID)
);
复制代码

在原本的基础上新增了一个category的外键,相应的在映射对象中添加category映射

class Post(db.Model):__tablename__ = "post"id = db.Column(db.Integer, primary_key=True, autoincrement=True)title = db.Column(db.String(80))body = db.Column(db.Text)up_date = db.Column(db.DateTime)clicked = db.Column(db.Integer)category_id = db.Column(db.Integer, db.ForeignKey('category.id'))category = db.relationship('Category',backref=db.backref('post', lazy='dynamic'))def __init__(self, title, body, category, clicked, up_date=None):self.title = titleself.body = bodyif up_date is None:up_date = datetime.utcnow()self.up_date = up_dateself.category = categoryself.clicked = clickeddef __repr__(self):return '<Post %r>' % self.title
复制代码

db.relationship()官方文档解释是

What does db.relationship() do? That function returns a new property that can do multiple things. In this case we told it to point to the Address class and load multiple of those. How does it know that this will return more than one address? Because SQLAlchemy guesses a useful default from your declaration. If you would want to have a one-to-one relationship you can pass uselist=False to relationship()

对于backref()的解释是

So what do backref and lazy mean? backref is a simple way to also declare a new property on the Address class. You can then also use my_address.person to get to the person at that address. lazy defines when SQLAlchemy will load the data from the database:

  • select / True (which is the default, but explicit is better than implicit) means that SQLAlchemy will load the data as necessary in one go using a standard select statement.
  • joined / False tells SQLAlchemy to load the relationship in the same query as the parent using a JOIN statement.
  • subquery works like joined but instead SQLAlchemy will use a subquery.
  • dynamic is special and can be useful if you have many items and always want to apply additional SQL filters to them. Instead of loading the items SQLAlchemy will return another query object which you can further refine before loading the items. Note that this cannot be turned into a different loading strategy when querying so it’s often a good idea to avoid using this in favor of lazy=True. A query object equivalent to a dynamic user.addresses relationship can be created using Address.query.with_parent(user) while still being able to use lazy or eager loading on the relationship itself as necessary.

怎么使用一对多数据

##增

        title = request.form.get("title")content = request.form.get("content")category = request.form.get("category")tags_web = request.form.get("tags")tags_str = tags_web.split(",")c = Category(category)p = Post(title, content, c, 0)db.session.add(p)db.session.commit()
复制代码

##删 与一对一类似

##查 与一对一类似

怎么配置多对多映射

多对多的配置比较特殊,它通过一张辅助表类实现多对多,所以在原本的数据库不需要添加任何字段,但需要新建一张辅助表

CREATE TABLE TAG_POST(ID INTEGER PRIMARY KEY AUTOINCREMENT ,TAG_ID INTEGER  ,POST_ID INTEGER
);
复制代码

然后在主程序中建立表格对应

tags = db.Table('tag_post',db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),db.Column('post_id', db.Integer, db.ForeignKey('post.id')))
复制代码

在映射对象中加入映射

class Post(db.Model):__tablename__ = "post"id = db.Column(db.Integer, primary_key=True, autoincrement=True)title = db.Column(db.String(80))body = db.Column(db.Text)up_date = db.Column(db.DateTime)clicked = db.Column(db.Integer)category_id = db.Column(db.Integer, db.ForeignKey('category.id'))category = db.relationship('Category',backref=db.backref('post', lazy='dynamic'))tags = db.relationship('Tag', secondary=tag_post,backref=db.backref('post', lazy='dynamic'))def __init__(self, title, body, category, clicked, up_date=None):self.title = titleself.body = bodyif up_date is None:up_date = datetime.utcnow()self.up_date = up_dateself.category = categoryself.clicked = clickeddef __repr__(self):return '<Post %r>' % self.title
复制代码

怎么使用多对多数据

        title = request.form.get("title")content = request.form.get("content")category = request.form.get("category")tags_web = request.form.get("tags")tags_str = tags_web.split(",")c = Category(category)p = Post(title, content, c, 0)for tag in tags_str:t = Tag(tag)p.tags.append(t)db.session.add(p)db.session.commit()
复制代码

想通过tag对象来找到里面的post的个数可以使用tag.post.count()

转载于:https://juejin.im/post/5a347956f265da430a50a573

SQLAlchemy数据库映射和使用相关推荐

  1. sqlalchemy(数据库炼金术)

    sqlalchemy ORM orm英文全称object relational mapping,就是对象映射关系程序,简单来说就是将数据库映射成编程语言可编辑的对象.在python下,就是sqlalc ...

  2. mysql数据库映射到内存_基于共享内存的数据库映射

    基于共享内存的数据库映射 概述 随着各类行业软件对性能追求越来越高,因此对数据库处理的速度提出了新的挑战.然而大部分复杂的业务处理往往依赖体量较大的关系数据(如:Oracle,Mysql,Postgr ...

  3. mysql如何配置hbm.xml_配置数据库映射文件hbm.xml

    在数据库映射方面,guzz支持类似hibernate的领域对象class-table映射.也支持ibatis类似的在guzz.xml中映射. hibernate的hbm.xml映射 guzz兼容hib ...

  4. Code First02---CodeFirst配置实体与数据库映射的两种方式

    Code First有两种配置数据库映射的方式,一种是使用数据属性DataAnnotation,另一种是Fluent API. 这两种方式分别是什么呢?下面进行一一解释: DataAnnotation ...

  5. FreeSql实体映射成数据库,数据库映射成实体类,指定表生成实体

    文章目录 codeList DbContext 指定表生成实体 codeList 首先codeList就是一个将实体类映射成数据库表的东西 使用方法: 1.先引入包 补充一下上图:这四个包都要安装 写 ...

  6. JAVA 之POI导入批量新增、批量检查、日志记录、失败原因、失败条数、数据库映射

    前言 欢迎大家来到我的博客,请各位看客们点赞.收藏.关注三连! 欢迎大家关注我的知识库,Java之从零开始·语雀 你的关注就是我前进的动力! CSDN专注于问题解决的博客记录,语雀专注于知识的收集与汇 ...

  7. IDEA自定义模板:快速指定一个数据库映射字段(驼峰生成下划线命名)

    用途 在数据库映射类中快速生成代码. 字段对应的注解,可以根据驼峰命名快速生成相应的数据库命名 步骤 1. 自定义代码模板 File -> Settings -> Editor -> ...

  8. mybatis mapper.xml数据库映射生成java实体,增删改查sql语句

    1.问题描述:使用mybatis生成mapper.xml文件的时候经常遇到数据库表字段很多,写mapper.xml文件时转化成java实体很麻烦,写增删改查的sql时也要做 很多重复的工作.程序员就想 ...

  9. python SQLAlchemy数据库工具

    一.sqlalchemy概述与架构 1.SQLAlchemy SQLAlchemy是Python编程语言下的一款开源软件.提供SQL包以及对象关联映射(ORM)工具,使用MIT许可证 SQLAlche ...

  10. 【建议收藏】Flask系列教程(三)SQLAlchemy数据库

    数据库是一个网站的基础,在Flask中可以自由的使用MySQL.PostgreSQL.SQLite.Redis.MongoDB来写原生的语句实现功能,也可以使用更高级别的数据库抽象方式,如SQLAlc ...

最新文章

  1. ORA-01031: insufficient privileges的解决方法
  2. postgresql数据表增删改:使用pgadmin和SQL的方式实现
  3. ORA-00257 错误解决
  4. 兼容IE678的placeholder
  5. figma设计_在Figma中使用隔片移交设计
  6. c++删除数组中重复元素_C / C ++中的数组
  7. 【Android Gradle 插件】Splits 配置 ④ ( Splits#language{} 脚本块配置 | 根据语言进行分包 | LanguageSplitOptions 配置简介 )
  8. 开天辟地第一人---盘古
  9. webflux 之 Stream流
  10. 2020数学建模国赛(B题)总结
  11. scss动态生成类名、样式值
  12. Quartz定时任务项目中的应用
  13. oss图片上传api_怎么上传图片到OSS
  14. 来自腾讯相当好的文章:研发效能度量实践指南
  15. 智能控制和计算机控制的区别,BA楼宇控制方式是什么 智能照明控制与BA楼宇控制方式的区别在哪...
  16. 安产链为安全生产保驾护航 | FinTechathon 安产链团队
  17. python爬取猫眼电影
  18. 明解C语言入门篇_第6章_函数
  19. Windows查看文件占用情况、查看程序的dll依赖项
  20. oracle sql sub,oracle数据库根据不同条件给同一字段修改相应的值

热门文章

  1. 代码笔记——Toast显示文本,图片,图文
  2. 查询子串_你知道什么是 MySQL 的模糊查询?
  3. 最大弹窗_你不在意的小弹窗,为什么总是出现问题?
  4. PHP str_replace() 函数详解
  5. JAVA数组元素的遍历_Java数组元素的遍历
  6. 全网首发:祝贺编译成功loongarch64 jna-5.10.0及难点说明
  7. char*转为LPCWSTR
  8. 2021-08-24梦笔记
  9. JDK8编译,JDK8运行错误
  10. 图片的变形与模糊,是两回事