Django 执行原生SQL

打印 上一主题 下一主题

主题 511|帖子 511|积分 1533

在Django中,你可以利用Raw SQL queries来执行原生的SQL查询。这对于需要进行复杂查询或Django的ORM无法满足的查询非常有用。

1,添加模型

Test/app11/models.py
  1. from django.db import models
  2. class Post(models.Model):
  3.     title = models.CharField(max_length=200)
  4.     content = models.TextField()
  5.     pub_date = models.DateTimeField('date published')
  6. class Book(models.Model):
  7.     title = models.CharField(max_length=100)
  8.     author = models.CharField(max_length=100)
  9.     publication_date = models.DateField()
  10.     price = models.DecimalField(max_digits=5, decimal_places=2)
  11.     def __str__(self):
  12.         return self.title
复制代码


2,添加视图函数

Test/app11/views.py


  • 查询所有数据
  • 根据条件查询
  • 多表查询
  1. from django.shortcuts import render
  2. from django.db.models import Q
  3. from django.db import connection
  4. def book_list_raw(request):
  5.     # 使用原生SQL查询所有书籍,基本查询
  6.     with connection.cursor() as cursor:
  7.         cursor.execute("SELECT * FROM app11_book")
  8.         rows = cursor.fetchall()
  9.     for row in rows:
  10.         print(row)
  11.     print('\n')
  12.     # 使用参数化查询防止SQL注入,条件查询
  13.     with connection.cursor() as cursor:
  14.         cursor.execute("SELECT * FROM app11_book WHERE title = %s", ['Python编程'])
  15.         row = cursor.fetchone()
  16.     print(row)
  17.     print('\n')
  18.     # 多表查询
  19.     sql="""select a.*, b.* from app11_book a ,app11_post b where a.id =b.id"""
  20.     Books = Book.objects.raw(sql)
  21.     for book in Books:
  22.         print(book.author, book.content)
  23.     return HttpResponse("查询数据数据")
复制代码


3,添加路由地点

Test/app11/urls.py
  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4.     path('book_list_raw/', views.book_list_raw, name='book_list_raw'),
  5. ]
复制代码


4,添加表数据

Test/create_books.py
  1. import os
  2. import django
  3. # 设置Django环境,需要指定settings模块
  4. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Test.settings")
  5. django.setup()
  6. from app11.models import Book
  7. def create_books():
  8.     # 创建示例书籍
  9.     book1 = Book(title="1Python编程", author="小强", publication_date="2022-01-01", price=15.99)
  10.     book2 = Book(title="1Django Web开发", author="小龙", publication_date="2022-04-15", price=29.99)
  11.     book3 = Book(title="1算法导论", author="小龙", publication_date="2024-07-20", price=19.99)
  12.     book4 = Book(title="2java入门到弃坑", author="余胜军", publication_date="2019-02-20", price=39.99)
  13.     book5 = Book(title="3c入门到弃坑", author="小龙", publication_date="2012-07-20", price=9.99)
  14.     book6 = Book(title="4c++入门到弃坑", author="小6", publication_date="2024-02-20", price=13.99)
  15.     book7 = Book(title="1python多线程入门", author="小6", publication_date="2025-02-20", price=49.99)
  16.     # 保存书籍到数据库
  17.     book1.save()
  18.     book2.save()
  19.     book3.save()
  20.     book4.save()
  21.     book5.save()
  22.     book6.save()
  23.     book7.save()
  24.     print("数据创建成功!")
  25. if __name__ == "__main__":
  26.     create_books()
复制代码
Test/create_posts.py
  1. import os
  2. import django
  3. # 设置Django环境,需要指定settings模块
  4. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Test.settings")
  5. django.setup()
  6. from app11.models import Post
  7. from datetime import datetime
  8. # 创建并保存Post对象
  9. post = Post(title="张国荣", content="(英语:Leslie Cheung Kwok Wing,1956年9月12日—2003年4月1日),本名张发宗,香港男歌手、演员、词曲作家[3],并曾经担任电影配乐、排舞、音乐视频导演、艺术总监和电影导演。", pub_date=datetime.now())
  10. post.save()
  11. # 或者使用objects.create()方法
  12. Post.objects.create(title="梅艳芳", content="英语:Anita Mui Yim-fong;1963年10月10日—2003年12月30日),香港女歌手、演员、社会活动家,有“乐坛大姐大”之称。她的形象百变,获奖无数,是香港粤语流行乐坛辉煌鼎盛期的标志性人物,也是香港演艺界第一位同时取得“歌后”及“影后”级殊荣的女艺人。", pub_date=datetime.now())
复制代码
 


5,访问页面

127.0.0.1:8000/app11/book_list_raw/

 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表