Django ORM 使用原生 SQL

本文详细介绍如何在Django中结合使用原生SQL与ORM进行数据操作,包括使用raw方法执行复杂查询、利用extra方法添加额外的SQL语句、以及通过connections模块直接执行SQL等高级技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用原生sql的 方法 :

  1. raw

    # row方法:(掺杂着原生sql和orm来执行的操作)
    res = CookBook.objects.raw('select id as nid  from  epos_cookbook  where  id>%s', params=[1, ])
    print(res.columns) # ['nid']
    print(type(res)) # <class 'django.db.models.query.RawQuerySet'>
    
    # 在select里面查询到的数据orm里面的要一一对应
    res = CookBook.objects.raw("select * from epos_cookbook")
    print(res)
    for i in res:
        print(i.create_date)
        print(i)
    
    res = CookBook.objects.raw('select * from epos_cookbook where id>%s', params=[1, ])
    # 后面可以加参数进来
    print(res)
    for i in res:
        # print(i.create_date)
        print(i)
  2. extra

    # (1,2) 必须两个以上
    # res = CookBook.objects.extra(select={"aaa": "cook_type = 1"}, where=['id in (1,2)', ]).values()
    res = CookBook.objects.extra(select={"aaa": "cook_type = 1"}, where=['id in (1,2)', ])
    print(res)  # <QuerySet [<CookBook: 鱼香肉丝>, <CookBook: 水煮鱼>]>
    for r in res:
        print(r)
  3. connections (最原生)

    from django.db import connection, connections
    # 需要配置数据库
    # cursor=connection['default'].cursor() 
    cursor = connection.cursor()  
    # 不传参数的情况
    cursor.execute("""select  * from epos_cookbook""")
    
    # 为原生sql语句设置参数的情况
    # cursor.execute("""select  * from  epos_cookbook   where   id=%s""",[2,]) # 2 是 id
    # cursor.execute("""select  * from  api_userinfo   where   id=%s"""%1)
    
    # 防止注入攻击
    cursor.execute("select  * from  epos_cookbook   where   id=%s", params=[1, ])
    # row=cursor.fetchone()
    # row=cursor.fetchmany()
    row = cursor.fetchall()  ##拿到全部的数据
    
    print(row)
    
    
    from django.db import connection
    
    cursor=connection.cursor()
    
    # 插入操作
    cursor.execute("insert into hello_author(name) values('钱钟书')")
    
    # 更新操作
    cursor.execute("update hello_author set name='abc' where name='bcd'")
    
    # 删除操作
    cursor.execute("delete from hello_author where name='abc'")
    
    # 查询操作
    cursor.execute("select * from hello_author")
    
    raw=cursor.fetchone()  # 返回结果行游标直读向前,读取一条
    cursor.fetchall()  # 读取所有
    

    数据库分离使用原生sql

    from django.db import connection, connections
    # cursor = connection.cursor()
    cursor = connections['db2'].cursor()
    cursor.execute("""SELECT * from app01_student """, )
    row = cursor.fetchall()
    print(row)

转载于:https://www.cnblogs.com/zhang-zi-yi/p/10769045.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值