GVKun编程网logo

Python MySQL 数据库查询:选择数据、使用筛选条件、防止 SQL 注入

3

本文将介绍PythonMySQL数据库查询:选择数据、使用筛选条件、防止SQL注入的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Delphi数据

本文将介绍Python MySQL 数据库查询:选择数据、使用筛选条件、防止 SQL 注入的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Delphi 数据库查询(TADOQuery)、Django Channels ORM 数据库查询、django 数据库查询 ORM、Excel 选择数据“添加”选项不再提供添加 x 和 y 值的选项的知识。

本文目录一览:

Python MySQL 数据库查询:选择数据、使用筛选条件、防止 SQL 注入

Python MySQL 数据库查询:选择数据、使用筛选条件、防止 SQL 注入

从表格中选择数据

要从MySQL中的表格中选择数据,请使用"SELECT"语句:

示例选择"customers"表格中的所有记录,并显示结果:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM customers")

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

注意:我们使用 fetchall() 方法,该方法从上次执行的语句中获取所有行。

选择列

要仅选择表格中的某些列,请使用"SELECT"语句,后跟列名:

示例仅选择name和address列:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT name, address FROM customers")

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

使用 fetchone() 方法

如果您只对一行数据感兴趣,可以使用 fetchone() 方法。

fetchone() 方法将返回结果的第一行:

示例仅获取一行:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM customers")

myresult = mycursor.fetchone()

print(myresult)

这是您提供的内容的Markdown排版,按照您的要求进行了整理。如果需要进一步的编辑或修改,请告诉我。

使用筛选条件选择记录

在从表格中选择记录时,您可以使用"WHERE"语句来筛选选择的记录:

示例选择地址为"Park Lane 38"的记录:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

sql = "SELECT * FROM customers WHERE address =''Park Lane 38''"

mycursor.execute(sql)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

通配符字符

您还可以选择以给定字母或短语开头、包含或以给定字母或短语结尾的记录。

使用 % 来表示通配符字符:

示例选择地址中包含单词 "way" 的记录:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

sql = "SELECT * FROM customers WHERE address LIKE ''%way%''"

mycursor.execute(sql)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

防止SQL注入

当查询值由用户提供时,应该转义这些值。

这是为了防止SQL注入,这是一种常见的网络黑客技术,可以破坏或滥用您的数据库。

mysql.connector 模块具有转义查询值的方法:

示例使用占位符 %s 方法转义查询值:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

sql = "SELECT * FROM customers WHERE address = %s"
adr = ("Yellow Garden 2", )

mycursor.execute(sql, adr)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

Delphi 数据库查询(TADOQuery)

Delphi 数据库查询(TADOQuery)

总结

以上是小编为你收集整理的Delphi 数据库查询(TADOQuery)全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Django Channels ORM 数据库查询

Django Channels ORM 数据库查询

如何解决Django Channels ORM 数据库查询?

我不知道我做错了什么

我无法获取数据库数据。

class AsyncChatConsumer(AsyncWebsocketConsumer):
    async def receive(self,text_data):
        users = await self.get_users()
        for user in users:
            print(user.id)

    @database_sync_to_async
    def get_users(self):
        return User.objects.all()
django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.

我查的资料和官方文档都是这样写的。

但是为什么我会收到错误消息?

解决方法

您的问题在 stackoverflow 上重复:

那里已经解释过了:Django Channels Error: you cannot use AsyncToSync in the same thread as an async event loop

django 数据库查询 ORM

django 数据库查询 ORM

实用的logging模块:

zaisetting配置中加入下列配置,将sql语句打印到屏幕上,可以进行查看。

LOGGING = {
    ''version'': 1,
    ''disable_existing_loggers'': False,
    ''handlers'': {
        ''console'':{
            ''level'':''DEBUG'',
            ''class'':''logging.StreamHandler'',
        },
    },
    ''loggers'': {
        ''django.db.backends'': {
            ''handlers'': [''console''],
            ''propagate'': True,
            ''level'':''DEBUG'',
        },
    }
}  

单表操作:

  添加记录:

# 方式1:
            #obj=Book.objects.create(title="python",publishDate="2012-12-12",price=100)
            
               注意:Book.objects.create()的返回值是当前添加的记录对象这种方式不需要save()
            # 方式2:
            book_obj=Book(title="python2",publishDate="2012-12-12",price=100)
            book_obj.save()

  查询记录:(数据类型:QuerySet)   [...,...,]

<1> all():                 查询所有结果
            <2> filter(**kwargs):      它包含了与所给筛选条件相匹配的对象     
            <3> get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                                       如果符合筛选条件的对象超过一个或者没有都会抛出错误。 
            <5> exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象     
            
            <4> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                                       model的实例化对象,而是一个可迭代的字典序列
            <9> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
             
            <6> order_by(*field):      对查询结果排序
            
            <7> reverse():             对查询结果反向排序
             
            <8> distinct():            从返回结果中剔除重复纪录
             
            <10> count():              返回数据库中匹配查询(QuerySet)的对象数量。
             
            <11> first():              返回第一条记录
             
            <12> last():               返回最后一条记录
             
            <13> exists():             如果QuerySet包含数据,就返回True,否则返回False
                   
            
            双下划线的查询:
             
                book_list=Book.objects.filter(price__gt=60)
                book_list=Book.objects.filter(price__lt=60)
                book_list=Book.objects.filter(title__contains="py") #这个用于查看是否包含某个数据。
                book_list=Book.objects.filter(title__startswith="python")
                book_list=Book.objects.filter(price__in=[60,70,100])
                book_list=Book.objects.filter(price__range=[50,99])

删除:

删除:
            Book.objects.filter().delete() # 默认级联删除

更新:

Book.objects.filter().update(price=50,.....)

一对多创建:

publish=models.ForeignKey(to="Publish",to_field="id")

多对多创建:

authors=models.ManyToManyField(to="Author")
author=models.OneToOneField("Author")

一对一添加:

# 方式1:
            #Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish_id=2)
            # 方式2:
            publish_obj=Publish.objects.filter(name="人民出版社")[0]
            Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish=publish_obj)

 

 

多对多添加:

book_authors.objects.create(book_id=1,author_id=2)   
             
            book_obj=Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish_id=2)             
            
            book_obj.authors.all()
            
            book_obj.authors.add(obj1,obj2....)
            book_obj.authors.add(*[]) #
                    
            book_obj.authors.remove(obj1,obj2....)
            book_obj.authors.remove(*[])
            book_obj.authors.clear()

批量添加:
        #在插入数据库记录的时候,需要将列表一条条插入数据库,容易造成性能浪费。插入一条记录生成一个sql语句。
    #下方这个解决这个问题。 models.UserInfo.objects.bulk_create() #里面是一个列表,这样是生成一个sql语句,将里面的用户全部插入

基于对象的跨表操作(子查询):

正查询与反查询:

  

一对多: 
    
        正向查询,按字段:publish
        反向查询,按表名小写_set
                   
        查询:

            查询java这本书的出版社的邮箱
          
            book_obj=Book.objects.filter(title="java").first()
            book_obj.publish.email

 

多对多:
    
        正向查询,按字段:authors
        反向查询,按表名小写_set
         
        查询: 
            book_obj.authors.all()        # 与这本书籍关联的所有作者对象集合
            author_obj.book_set.all()

 

 一对一:
          
        添加记录:参考一对多       
        查询记录:
        
            正向查询,按字段:author
            反向查询,按表名小写

基于QuerySet的跨表查询(join查询)   

#一对多 publish:与当前书籍对象关联的的出版社对象
    publish=models.ForeignKey(to="Publish",to_field="id")
    #多对多 authors
    authors=models.ManyToManyField(to="Author")
    author=models.OneToOneField("Author")
    
    
    正向查询,按字段:publish
    反向查询,按表名小写

 

一对多: 
            例1:
            查询java这本书的出版社的邮箱(正向查询)
            
            ret=Book.objects.filter(nid__gt=6).values("publish__name")
            
            sql:
                SELECT "app01_publish"."name"   
                FROM "app01_book" INNER JOIN "app01_publish" 
                ON ("app01_book"."publish_id" = "app01_publish"."id") 
                WHERE "app01_book"."nid" > 6 LIMIT 21;
                
            values实现机制:
                 对调用的QuerySet集合对象里面的每一个对象循环遍历,取出每一个对象的显示字段的值,组成新的字典,放在一个新的QuerySet中,返回
            
            例2:
            # 查询人民出版社出版过的所有的书籍名称(反向查询)
            ret=Publish.objects.filter(name="人民出版社").values("book__title")
            print(ret)        
            <QuerySet [{''book__title'': ''golang''}, {''book__title'': ''linux2''}, {''book__title'': ''qq''}, {''book__title'': ''www''}]>

 

多对多的查询
            # 查询php这本书籍的所有作者的名字以及年龄
            # ret=Book.objects.filter(title="php").values("authors__name","authors__age")
            # print(ret)
            # 查询alex出版社过的所有书籍的名称和价格
            # ret=Author.objects.filter(name="alex").values("book__title","book__price")
            # print(ret)

 

一对一查询
            # 查询tel=789的作者的名字
            ret=AuthorDetail.objects.filter(tel="789").values("author__name")
            # 查询alex的手机号是多少
            ret=Author.objects.filter(name="alex").values("authordetail__tel")

 

扩展:
        #查询人民出版社出版过的所有的书籍名称(两种查询思路,基表不同)
        
        ret=Publish.objects.filter(name="人民出版社").values("book__title")
        ret=Book.objects.filter(publish__name="人民出版社").values("title")
    
        # 手机号以151开头的作者出版过的所有书籍名称以及出版社名称

        ret=Book.objects.filter(authors__authordetail__tel__startswith="7").values("title","publish__name")
        print(ret)

           SELECT "app01_book"."title", "app01_publish"."name" FROM "app01_book" 
           INNER JOIN "app01_book_authors" ON ("app01_book"."nid" = "app01_book_authors"."book_id") 
           INNER JOIN "app01_author" ON ("app01_book_authors"."author_id" = "app01_author"."id") 
           INNER JOIN "app01_authordetail" ON ("app01_author"."id" = "app01_authordetail"."author_id") 
           INNER JOIN "app01_publish" ON ("app01_book"."publish_id" = "app01_publish"."id") 
           WHERE 
           "app01_authordetail"."tel" LIKE ''7%'' ESCAPE ''\'' LIMIT 21; args=(''7%'',)

 

 

聚合查询与分组查询

ORM:
    
        # 聚合函数  aggregate
        from django.db.models import Sum,Count,Max,Min,Avg
        # ret=Book.objects.all().aggregate(Sum("price"))
        # print(ret)

        # 分组函数 annotate

        # 查询每一个出版社出版社出版的书籍个数
        # ret=Publish.objects.all().annotate(c=Count("book__title")).values("name","c")
        # print(ret) # <QuerySet [<Publish: 人民出版社>, <Publish: 机械出版社>, <Publish: 北京出版社>]>

        # 查询每一本书的作者个数
        #ret=Book.objects.all().annotate(author_num=Count("authors")).values("author_num","title")
        # ret=Book.objects.all().annotate(author_num=Count("authors")).filter(author_num__gt=0)
        # print(ret)

 

 ORM中的extra函数:

我们可以用extra这个接口来实现较为复杂的sql函数,下面的archive_date是你自命名的字段,strftime相当于mysql中的date_format函数,将日期转换为想要的格式。

date_list=models.Article.objects.extra(select={"archive_date":"strftime(''%%Y-%%m'',create_time)"}).values(''archive_date'').annotate(count=Count("nid")).values_list("archive_date",''count'')


 

 

 

 

xxx

Excel 选择数据“添加”选项不再提供添加 x 和 y 值的选项

Excel 选择数据“添加”选项不再提供添加 x 和 y 值的选项

如何解决Excel 选择数据“添加”选项不再提供添加 x 和 y 值的选项

使用 Excel 2016。我想向现有绘图添加第二条曲线,但是当我右键单击现有绘图并选择“选择数据”选项,然后选择“添加”选项时,我得到以下对话框:

Excel Edit Series Menu 1

请注意,我无法同时选择一组 x 和 y 值。为什么我没有得到以下菜单,它允许我选择 x 和 y 值?

Excel Edit Series Menu 2

今天关于Python MySQL 数据库查询:选择数据、使用筛选条件、防止 SQL 注入的介绍到此结束,谢谢您的阅读,有关Delphi 数据库查询(TADOQuery)、Django Channels ORM 数据库查询、django 数据库查询 ORM、Excel 选择数据“添加”选项不再提供添加 x 和 y 值的选项等更多相关知识的信息可以在本站进行查询。

本文标签: