ORM对象关系映射

Python框架篇之Django(ORM对象关系映射) 文章目录一、认识ORM二、模型常用字段类型三、数据表的增删改查四、配置日志 一、认识ORM 1、概念:简单来说,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作。 2、ORM的优点 ORM使我们的通用数据库交互变得简单易行,完全不用考虑该死的SQL语句,实现快速开发 可以避免一些新手程序猿写SQL语句带来的性能问题 3、表与表之间的关系 表与表之间的关系主要分为:一对一、一对多、多对多 一对一:在主外键(foreign key)的关系基础上,给外键加了属性 一个班级有很多学生,他们分别有 阅读详情

一.ORM 的特征

映射关系:
  • 数据表 ----- 类
  • 数据行 ----- 对象
  • 字段 ----- 属性
目的:

用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作。

优点:
  1. ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑复杂的SQL语句。快速开发,由此而来。
  2. 可以避免一些新手程序猿写 sql 语句带来的性能问题。
缺点:
  1. ORM 库不是轻量级工具,需要花很多精力学习和设置。
  2. 对于复杂的查询,ORM 要么是无法表达,要么是性能不如原生的 SQL。
  3. ORM 抽象掉了数据库层,开发者无法了解底层的数据库操作,也无法定制一些特殊的 SQL。
模型之间三种关系:
  1. 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;
  2. 一对多:就是主外键关系(foreign key);
  3. 多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key)。
作用:
  1. 操作数据表(创建,修改,删除表)
  2. 操作数据行(增删改查)

二. ORM操作MySQL步骤

1. 在MySQL上创建数据库
2. 利用pymysql连接数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 's4day70db',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '123456', #你的数据库密码
        'HOST': 'localhost',  #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
    }
}
3. 修改__init__.py
import pymysql
pymysql.install_as_MySQLdb()
4. 在app01的models中创建类,生成表
from django.db import models

# Create your models here.
class UserInfo(models.Model):
    nid = models.BigAutoField(primary_key=True)
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
5. 注册app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'app01',
]
6. 同步数据库
python manage.py makemigrations
python manage.py migrate
7. 外键
class UserType(models.Model):
    title = models.CharField(max_length=32)
    fo = models.ForeignKey('Foo',on_delete=models.CASCADE)

扩展:修改表之后常见‘ 报错 ’

You are trying to add a non-nullable field 'tele' to publisher without a default; we can't do that (the database needs something
 to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option:

这个报错:因为表创建好之后,新增字段没有设置默认值,或者原来表中字段设置了不能为空参数,修改后的表结构和目前的数据冲突导致;

模型常用的字段类型参数 :
<1> CharField
        #字符串字段, 用于较短的字符串.
        #CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.

<2> IntegerField
       #用于保存一个整数.

<3> FloatField
        # 一个浮点数. 必须 提供两个参数:
        #        # 参数    描述
        # max_digits    总位数(不包括小数点和符号)
        # decimal_places    小数位数
                # 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
                #                # models.FloatField(..., max_digits=5, decimal_places=2)
                # 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:
                #                # models.FloatField(..., max_digits=19, decimal_places=10)
                # admin 用一个文本框(<input type="text">)表示该字段保存的数据.

<4> AutoField
        # 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段; 
        # 自定义一个主键:my_id=models.AutoField(primary_key=True)
        # 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.

<5> BooleanField
        # A true/false field. admin 用 checkbox 来表示此类字段.

<6> TextField
        # 一个容量很大的文本字段.
        # admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框).

<7> EmailField
        # 一个带有检查Email合法性的 CharField,不接受 maxlength 参数.

<8> DateField
        # 一个日期字段. 共有下列额外的可选参数:
        # Argument    描述
        # auto_now    当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.
        # auto_now_add    当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
        #(仅仅在admin中有意义...)

<9> DateTimeField
        #  一个日期时间字段. 类似 DateField 支持同样的附加选项.

<10> ImageField
        # 类似 FileField, 不过要校验上传对象是否是一个合法图片.
# 它有两个可选参数:height_field和width_field,
        # 如果提供这两个参数,则图片将按提供的高度和宽度规格保存.     
<11> FileField
     # 一个文件上传字段.
     #要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime #formatting, 
     #该格式将被上载文件的 date/time 
     #替换(so that uploaded files don't fill up the given directory).
     # admin 用一个<input type="file">部件表示该字段保存的数据(一个文件上传部件) .

     #注意:在一个 model 中使用 FileField 或 ImageField 需要以下步骤:
            #(1)在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件. 
            # (出于性能考虑,这些文件并不保存到数据库.) 定义MEDIA_URL 作为该目录的公共 URL. 要确保该目录对 
            #  WEB服务器用户帐号是可写的.
            #(2) 在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django
            # 使用 MEDIA_ROOT 的哪个子目录保存上传文件.你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT). 
            # 出于习惯你一定很想使用 Django 提供的 get_<#fieldname>_url 函数.举例来说,如果你的 ImageField 
            # 叫作 mug_shot, 你就可以在模板中以 {{ object.#get_mug_shot_url }} 这样的方式得到图像的绝对路径.

<12> URLField
      # 用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在( 即URL是否被有效装入且没有返回404响应).
      # admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)

<13> NullBooleanField
       # 类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanField 加 null=True 选项
       # admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" 和 "No" ) 来表示这种字段数据.

<14> SlugField
       # "Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.#它们通常用于URLs
       # 若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定, Django 会使用默认长度: 50.  #在
       # 以前的 Django 版本,没有任何办法改变50 这个长度.
       # 这暗示了 db_index=True.
       # 它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-#populate 
       # the slug, via JavaScript,in the object's admin form: models.SlugField
       # (prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields.

<15> XMLField
        #一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema #的文件系统路径.

<16> FilePathField
        # 可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.
        # 参数    描述
        # path    必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目. 
        # Example: "/home/images".
        # match    可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名.  
        # 注意这个正则表达式只会应用到 base filename 而不是
        # 路径全名. Example: "foo.*\.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.
        # recursive可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.
        # 这三个参数可以同时使用.
        # match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:
        # FilePathField(path="/home/images", match="foo.*", recursive=True)
        # ...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif

<17> IPAddressField
        # 一个字符串形式的 IP 地址, (i.e. "24.124.1.30").
<18># CommaSeparatedIntegerField
        # 用于存放逗号分隔的整数值. 类似 CharField, 必须要有maxlength参数.
Field重要参数 :
 	<1> null : 数据库中字段是否可以为空

    <2> blank: Admin中是否允许用户输入为空

    <3> default:数据库中字段的默认值

    <4> editable:如果为假,admin模式下将不能改写。缺省为真

    <5> primary_key:设置主键,如果没有设置django创建表时会自动加上:
        id = meta.AutoField('ID', primary_key=True)
        primary_key=True implies blank=False, null=False and unique=True. Only one
        primary key is allowed on an object.

    <6> unique:数据唯一

    <7> verbose_name  Admin中字段的显示名称

    <8> validator_list:有效性检查。非有效产生 django.core.validators.ValidationError 错误

    <9> db_column,db_index 如果为真将为此字段创建索引

    <10>choices:一个用来选择值的2维元组。第一个值是实际存储的值,第二个用来方便进行选择。
                如SEX_CHOICES= (( ‘F’,'Female’),(‘M’,'Male’),)
                gender = models.CharField(max_length=2,choices = SEX_CHOICES)
ORM查询操作
  1. all():查询所有结果,返回QuerySet对象
  2. get():返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误,返回单个对象
  3. filter():返回所有符合条件的对象,返回QuerySet对象
  4. exclude():返回所有不符合条件的对象,返回QuerySet对象
  5. values(‘字段’):拿到对象指定的字段和字段的值,返回的是一个字典序列,返回QuerySet对象
  6. values_list(‘字段’):拿到对象指定的字段的值,返回的是一个元组序列,返回QuerySet对象
  7. order_by():对查询结果排序,默认升序,字段前加负号则为降序,返回QuerySet对象
    order_by(‘age’,’-pid’):先按age字段升序排列,再按pid字段降序排列
  8. reverse():对查询结果反向排序,只能对已经排序的QuerySet进行反转,返回QuerySet对象
  9. distinct():对查询结果进行去重,完全相同的内容才能去重,返回QuerySet对象
  10. count():计数,返回数据库中匹配查询的对象数量,返回数字
  11. first():返回第一条记录,即取第一个元素,没有返回None,返回单个对象
  12. last():返回最后一条记录,即取最后一个元素,没有返回None,返回单个对象
  13. exist():判断查询的数据是否存在,存在返回True,否则返回False,返回布尔值
QuerySet对象

特点:

  • 可迭代
  • 可切片
# objs=models.Book.objects.all()#[obj1,obj2,ob3...]

# QuerySet:   可迭代
    # for obj in objs:#每一obj就是一个行对象
    #     print("obj:",obj)
    
# QuerySet:  可切片
    # print(objs[1])
    # print(objs[1:4])
    # print(objs[::-1])
单表查询的双下划线
# 1.条件判断,相当于SQL中的 where
#   __gt:大于
#       ret = models.Person.objects.filter(pk__gt=1)
#           获取pk大于1的
#   __lt:小于
#       ret = models.Person.objects.filter(pk__lt=3)
#           获取pk小于3的
#   __gte:大于等于
#       ret = models.Person.objects.filter(pk__gte=1)
#           获取pk大于等于1的
#   __lte:小于等于
#       ret = models.Person.objects.filter(pk__lte=3)
#           获取pk小于等于3的
# 2.__range:范围查询,相当于SQL的between...and...
#       ret = models.Person.objects.filter(pk__range=[1,3])
#           获取pk范围是1到3的
# 3.__in:成员判断
#       ret = models.Person.objects.filter(pk__in=[1,3])
#           获取pk等于1、3的,相当于SQL的 in
#       ret = models.Person.objects.exclude(pk__in=[1,3])
#           获取pk不等于1和3的,相当于SQL的 not in
# 4.模糊查询:相当于SQL的 like 和正则匹配
#       __contains:模糊查询
#           ret = models.Person.objects.filter(name__contains='A')
#               获取name字段的值包含'A'的
#       __icontains:在contains的基础上,对条件中的字母大小写不敏感
#           ret = models.Person.objects.filter(name__icontains='A')
#               获取name字段的值包含'A'或'a'的,忽略大小写
# 5.判断以...开头/结尾
#       __startswith:以...开头
#           ret = models.Person.objects.filter(name__startswith='A')
#               获取name字段的值以'A'开头的
#       __istartswith:在startswith的基础上,对条件中的字母大小写不敏感
#           ret = models.Person.objects.filter(name__istartswith='A')
#               获取name字段的值以'A'或'a'开头的,忽略大小写
#       __endswith:以...结尾
#           ret = models.Person.objects.filter(name__endswith='A')
#               获取name字段的值以'A'结尾的
#       __iendswith:在endswith的基础上,对条件中的字母大小写不敏感
#           ret = models.Person.objects.filter(name__iendswith='A')
#               获取name字段的值以'A'或'a'结尾的,忽略大小写
# 6.__year:判断日期年份
#       ret = models.Person.objects.filter(birth__year='2019')
#           获取birth字段的值的年份是2019的
#       __year只能筛选年份,如果要筛选年月日,使用contains:模糊查询
#           ret = models.Person.objects.filter(birth__contains='2018-06-24')
#               获取birth字段的值是2018-06-24的
# 7.__isnull:查询与null的项
#       __isnull = True:查询值是null的
#           ret = models.Person.objects.filter(phone__isnull=True)
#               获取phone字段的值是null的
#       __isnull = False:查询值不是null的

三. ORM表的操作

3.1 增(create, save)
from app01.models import *

    #create方式一:   Author.objects.create(name='Alvin')

    #create方式二:   Author.objects.create(**{"name":"alex"})

    #save方式一:     author=Author(name="alvin")
                    author.save()

    #save方式二:     author=Author()
                    author.name="alvin"
                    author.save()
3.2 删

单表删除(delete)

Book.objects.filter(id=1).delete()

多对多删除(remove, clear)

#正向
book = models.Book.objects.filter(id=1)

#删除第三张表中和女孩1关联的所有关联信息
book.author.clear()        #清空与book中id=1 关联的所有数据
book.author.remove(2)  #可以为id
book.author.remove(*[1,2,3,4])     #可以为列表,前面加*

#反向
author = models.Author.objects.filter(id=1)
author.book_set.clear() #清空与boy中id=1 关联的所有数据
3.3 改

单表修改(update, save)

# update:
	models.Book.objects.filter(id=3).update(title="PHP")
# sql : UPDATE "app01_book" SET "title" = 'PHP' WHERE "app01_book"."id" = 3;

# save:
	obj=models.Book.objects.filter(id=3)[0]
    obj.title="Python"
    obj.save()

多对多修改(add)

obj=Book.objects.filter(id=1)[0]
author=Author.objects.filter(id__gt=2)

obj.author.clear()
obj.author.add(*author)
3.4 查

对象查询:

# 正向查找
    ret1=models.Book.objects.first()
    print(ret1.title)
    print(ret1.price)
    print(ret1.publisher)
    print(ret1.publisher.name)  #因为一对多的关系所以ret1.publisher是一个对象,而不是一个queryset集合

# 反向查找
    ret2=models.Publish.objects.last()
    print(ret2.name)
    print(ret2.city)

单表条件查询

#    models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
#
#    models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
#    models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
#
#    models.Tb1.objects.filter(name__contains="ven")
#    models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
#
#    models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and

多表条件关联查询

正向查找(条件)

      #正向查找(条件)之 一对多
      ret4=models.Book.objects.filter(title='Python').values('publisher__city')
      print(ret4)  #[{'publisher__city': '北京'}]

      #正向查找(条件)之 多对多
      ret5=models.Book.objects.filter(title='Python').values('author__name')
      print(ret5)
      ret6=models.Book.objects.filter(author__name="alex").values('title')
      print(ret6)

      #注意
      #正向查找的publisher__city或者author__name中的publisher,author是book表中绑定的字段
      #一对多和多对多在这里用法没区别

# 反向查找(条件)

    #反向查找之 一对多:
    ret8=models.Publisher.objects.filter(book__title='Python').values('name')
    print(ret8)#[{'name': '人大出版社'}]  注意,book__title中的book就是Publisher的关联表名

    ret9=models.Publisher.objects.filter(book__title='Python').values('book__authors')
    print(ret9)#[{'book__authors': 1}, {'book__authors': 2}]

    #反向查找之 多对多:
    ret10=models.Author.objects.filter(book__title='Python').values('name')
    print(ret10)#[{'name': 'alex'}, {'name': 'alvin'}]

    #注意
    #正向查找的book__title中的book是表名Book
    #一对多和多对多在这里用法没区别

四.ORM 中所有的方法

  • all(): 查询所有结果

  • filter(**kwargs): 它包含了与所给筛选条件相匹配的对象。获取不到返回None

  • get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个。获取不到会抛异常如果符合筛选条件的对象超过一个或者没有都会抛出错误。

  • exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象

  • order_by(*field): 对查询结果排序

  • reverse(): 对查询结果反向排序

  • count(): 返回数据库中匹配查询(QuerySet)的对象数量。

  • first(): 返回第一条记录

  • last(): 返回最后一条记录

  • exists(): 如果QuerySet包含数据,就返回True,否则返回False

  • values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系 model的实例化对象,而是一个可迭代的字典序列 values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

  • distinct(): 从返回结果中剔除重复纪录

Java对象关系映射(ORM) 一、什么是对象关系映射 简单来说,对象关系映射即是将Java中的对象一一对应映射到MySQL(本文基于MySQL)的Table(表)中,通过对对象各个属性赋值来更新数据库。 官方的说,对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。(本段来自百度百科) 二、如何写OR... 阅读详情

相关推荐

ORM 对象关系映射

ORM概念 ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。 ORM可理解成一种规范,它概述了这类框架的基本特征,完成面向对象的变成语言到数据库的映射。 ORM 把数据库映射成对象。 将数据库的表(table)映射为:类(class) 记录(record,行数据)映射为:对象(object) 字段(field)映射为:对象的属性(attribute) 举例来说,下面是一行 SQL 语句。 SELECT i

流楚丶格念的博客 2021

ORM基本操作

在django中, 根据代码中的类自动生成数据库的表叫做code firstORM:object relational mapping 关系对象映射数据库。

Yietong的博客 748

CodeBuddy 接入 MCP,一键生成网站!

2024 年 11 月,Anthropic 公司搞了个挺有意思的新玩意 - Model Context Protocol(模型上下文协议)简称为 MCP 协议。简单来说,它就是给 AI 和各类工具数据之间搭了个标准化的”桥梁”,让开发者不用再为对接问题头疼了。mcp.so如下图所示,这是 mcp.so 网站中的 MCP Server。使用百度/高德地图分析旅线计算时间接 Puppeteer 自动操作网页使用 Github/Gitlab 让大模型接管代码仓库。

悟空聊架构的专栏 1946

专题8:ORM基本操作

ORM基本操作

Vincent_Zhang233的博客 755

HRNet 【demo 复现过程】

Deep High-Resolution Representation Learning for Human Pose Estimation

qq_45257495的博客 5558

LightTools宏 vs Python API:光学仿真自动化方案选型指南

本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。

garlic的博客 940

Orm映射 java_ORM框架三种映射在Springboot上的使用

ORM(对象/关系映射)是数据库层非常重要的一部分,有三种常用的映射关系1.多对一tbl_clazzclazz{idnamedescriptiongrade_idcharge_id}clazz {idnamedescriptiongrade:{id:name:...},charge:{idnamegender}}提供多对一的查询 -------班级表对应年级表和班主任表beanextendCl...

weixin_31304599的博客 659

大型我的世界RPG服务器开服全攻略:从环境配置到插件部署

搭建一个能支撑百人稳定在线的我的世界服务器,远不止选择服务端和安装插件那么简单。服务器架设涉及硬件选型、Java环境、端口放行、启动脚本与systemd守护等基础环节,而大型RPG玩法还依赖MythicMobs、Quests、LuckPerms等插件协同工作。理解这些技术组件的原理与配置逻辑,是确保长线运营的关键。对于希望打造原创剧情、职业副本和自定义Boss的团队而言,合理规划MySQL数据库、RCON批量管理及性能调优,能显著降低后期维护成本。本文围绕RPG服务器核心能力,从环境准备到插件部署,再到常见

weixin_27230891的博客 370

对象关系映射ORM

目前使用JDBC完成了CRUD,但是现在是进行CRUD,增删改方法要设计很多参数,查询的方法需要设计集合才能返回.在实际开发中,我们需要将零散的数据封装到对象处理.ORM (Object Relational Mapping) 对象关系映射是指数据库表与Java的实体类有关系,可以进行映射数据库表 --> Java的类字段 --> 类的属性...一行数据 --> 类的对象一行数据内每个列的值 --> 对象的属性值。

weixin_61898502的博客 1124

【Flink】FlinkSQL如何触发执行计算

Table (通过 StatementSet.addInsert() 输出给某个 Sink)和 INSERT 语句 (通过调用 StatementSet.addInsertSql())会先被缓存到 StatementSet 中,StatementSet.execute() 方法被调用时,所有的 sink 会被优化成一张有向无环图。该方法是用来将一个表的内容插入到目标表中,一旦该方法被调用, TABLE API 程序立即被翻译。该方法是用来执行一个 SQL 语句,一旦该方法被调用, SQL 语句立即被翻译。

一杯咖啡半杯糖的博客 1007

波浪补偿控制(AHC)之波浪发生器(CODESYS完整源代码)

波浪发生器平台详细算法和结构介绍请参看下面博客文章:CODESYS平台如何建立FC和FB,请参看下面博客文章:

RXXW_Dor的博客 401

ORM——对象关系映射

ORM框架通过其强大的抽象能力,显著提升了数据库操作的效率和安全性。尽管存在一些性能和学习成本方面的考量,但在大多数业务场景下,ORM框架的优势远大于其局限性。选择适合项目需求的ORM框架,遵循最佳实践进行开发,将帮助开发者构建出高效、健壮的数据访问层。对于现代应用程序开发而言,掌握ORM框架已成为每个开发者的必备技能。

weixin_45778846的博客 1823

MCU-内部flash模拟成EepRom(重新梳理)

通过fee写数据Data的过程中,数据会mapping一个虚拟地址,这个虚拟地址就是你的身份,在向flash写数据的过程中会写入很多相同虚拟地址的不同数据,在读取或切页的过程中,遍历数据只会认为最下面第一个的虚拟地址所持有的数据是有效数据,其他的都是老数据,可以丢弃。模拟成eeprom的两个eep_page写数据逻辑就是,先在eep_page0写数据,eep_page0写满后,将eep_page0的有效数据copy到eep_page1,之后擦eep_page0;

xiandang8023的博客 711

对象关系映射(ORM)

本文主要介绍 对象关系映射(ORM) 是什么,以及它的优缺点。

步入人工智能 3371

华为OD机试真题 新系统2026-04-01 C语言 实现【空间占用计算】

员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。

MISAYAONE的博客 231

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

什么是ORM(对象关系映射)?使用ORM的利弊是什么?

本报告旨在全面深入地探讨对象关系映射(Object-Relational Mapping, ORM)技术。报告将从ORM的基本定义与核心工作原理出发,系统性地分析其在现代软件开发中带来的主要优势与固有的缺点。此外,报告还将审视主流ORM框架的性能特点,探讨其在微服务等复杂架构中的应用挑战与最佳实践,并展望ORM技术与GraphQL集成、异步执行等未来发展方向。本报告的目标是为技术决策者、架构师及开发者提供一个关于ORM技术的、结构清晰且内容详实的参考。对象关系映射(ORM)是一种编程技术,其核心目标是在遵循

破损的天堂鸟博客 2351

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

什么是对象关系映射ORM

对象关系映射1(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。 从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。 关于对象数据库参见:《关系数据库与对象数据库...

漫步量化 714

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

什么是 ORM对象关系映射

对象关系映射ORM 的全称是 Object-Relational Mapping,即 对象-关系映射。

weixin_51288065的博客 1598

ORM--对象关系映射

一、什么是ORM? 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 二、ORM的由来 让我们从O/R开始。...

Auhiak的博客 6551

python对象关系映射ORM

ORM全称Object Relational Mapping, 即对象关系映射。就是把关系数据的一行映射为一个对象,也就是一个类对应一张表,这样,就无需直接操作SQL语句。 ORM框架底层的所有类都是动态的,这是为了支持使用者根据表定义出类, 当用户定义一个class User(Model)时,Python解释器首先在当前类User的定义中查找metaclass, 如果没有找到,就继续在父类...

weixin_34150503的博客 361

ORM(对象关系映射)详解

ORM(对象关系映射)是一种将关系数据库与面向对象编程结合的技术,通过将数据库表映射为类、行映射为对象、列映射为属性,使开发者可以用面向对象方式操作数据库。主要优点包括提高开发效率、面向对象操作、数据库无关性、自动类型转换和防止SQL注入;缺点则涉及性能损失、复杂查询困难和学习成本。常见ORM框架有SQLAlchemy(Python)、Hibernate(Java)等。适用于大多数CRUD操作和快速开发,但在复杂查询或性能关键场景下可能需要原生SQL。ORM工作流程包括定义模型、创建表、会话管理和CRUD操

2301_80809484的博客 1162

django之ORM对象关系映射

ORM 对象关系映射,对象关系映射的意思就是在Python中 类对应数据库中的表格。 对象对应表格中的记录。 属性对应表格中的字段。 ORM通过让我们程序员使用面向对象的思想来操作数据库,不用直接再编写sql语句。提高开发效率。 数据建模:简单地说就是使用数据库来描述我们的业务逻辑。 Teacher表: Name Age Salary Subject Student表: Name Age Hob...

HobbitX的博客 723
下一篇: Django 总结(超级实用!!!)
sumatch
博客等级 码龄8年 251粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值