py_Django的数据库操作
admin
2023-06-08 01:21:31
0




数据库引擎



pymysql   取而代之    ----推荐

    2的话pip install pymysql
    3的话 pip3 install pymysql
    安装完成后用pip3 freeze 查看一下安装的什么版本之类的 


MySQLdb   python3不支持,也TM很久没更新了

    sudo yum install python-devel mysql-devel

    MySQL-python-1.2.5,这才是python2.7.6的mysql接口

    https://pypi.python.org/pypi/MySQL-python/1.2.5

    import MySQLdb



mysqlclient     django1.9推荐,python3.3+支持

    sudo yum install python-devel mysql-devel

    pip install mysqlclient

MySQL Connector/Python  





$ python manage.py makemigrations polls     stored as amigration.
$ python manage.py sqlmigrate polls 0001     just returns their SQL
$ python manage.py check    
# this checks for any problems in your project without making migrations or touching the database.
$ python manage.py migrate    apply those changes to the database.

会自动生成主键_id






python manage.py shell


基本数据访问

>>> from books.models import Publisher            
>>> p1 = Publisher(name='Apress', address='....)  
>>> p1.save()                                     
>>> publisher_list = Publisher.objects.all()
    
>>> publisher_list
[]

`` objects.create()``  一步完成对象的创建与存储至数据库,就不需要save

>>> p1 = Publisher.objects.create(name='Apress',
...     address='2855 Telegraph Avenue',..............


添加模块的字符串表现

Publisher 对象添加一个方法 __unicode__() 

from django.db import models
class Publisher(models.Model):
    name = models.CharField(max_length=30)
    def __unicode__(self):
        return self.name
>>> from books.models import Publisher
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[]



插入和更新数据


因为 Publisher 模型有一个自动增加的主键 id ,所以第一次调用 save() 还多做了一件事: 计算这个主键的值并把它赋值给这个对象实例:

>>> p.id
52    # this will differ based on your own data

接下来再调用 save() 将不会创建新的记录,而只是修改记录内容(也就是 执行 UPDATE SQL语句,而不是INSERT 语句):

>>> p.name = 'Apress Publishing'
>>> p.save()


注意,并不是只更新修改过的那个字段,所有的字段都会被更新。 这个操作有可能引起竞态条件


选择对象

取出所有记录:

>>> Publisher.objects.all()
[]


数据过滤

filter()返回集合

你可以传递多个参数到 filter() 来缩小选取范围:

>>> Publisher.objects.filter(country="U.S.A.", state_province="CA")
[]

 name  contains 之间有双下划线。contains部分会被Django翻译成LIKE语句:

>>> Publisher.objects.filter(name__contains="press")
[]

注意,SQL缺省的 = 操作符是精确匹配的

SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE name LIKE '%press%';

其他的一些查找类型有:icontains(大小写无关的LIKE),startswithendswith, 还有range(SQLBETWEEN查询)。 附录C详细描述了所有的查找类型。


获取单个对象

`` get()`` 返回单个的对象

>>> Publisher.objects.get(name="Apress")

如果结果是多个对象,会导致抛出异常,如果查询没有返回结果也会抛出异常:

DoesNotExist: Publisher matching query does not exist.

 Publisher.DoesNotExist 在你的应用中,你可以捕获并处理这个异常,像这样:

try:
    p = Publisher.objects.get(name='Apress')
except Publisher.DoesNotExist:
    print "Apress isn't in the database yet."
else:
    print "Apress is in the database."

数据排序


有序返回查询结果

如果需要以多个字段为标准进行排序(第二个字段会在第一个字段的值相同的情况下被使用到),减号 -
表示逆向排序:

>>> Publisher.objects.order_by("-state_province", "address")
 []

Django让你可以指定模型的缺省排序方式: class Meta,内嵌类。

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    
    def __unicode__(self):
        return self.name
        
    **class Meta:**
        **ordering = ['name']**


连锁查询

“链式”的形式:

>>> Publisher.objects.filter(country="U.S.A.").order_by("-name")
[]


限制返回的数据

取出固定数目的记录,剪语句,不支持负索引,但可逆序查询

>>> Publisher.objects.order_by('-name')[0:2]


更新多个对象

更新一条记录

>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')

更新多条记录。

>>> Publisher.objects.all().update(country='USA')   # 所有Publisher的country字段
2                        # 表示受影响的记录条数

注:save()方法,这个方法会更新一行里的所有列。 而某些情况下,我们只需要更新行里的某几列。

删除对象

删除数据库中的对象只需调用该对象的delete()方法即可:

>>> p = Publisher.objects.get(name="O'Reilly")
>>> p.delete()
>>> Publisher.objects.all()
[]
>>> Publisher.objects.filter(country='USA').delete()    # 删除部分
>>> Publisher.objects.all().delete()            # 删除所有

 为了预防误删除掉某一个表内的所有数据,Django要求在删除表内所有数据时显示使用all()。 否则报错

>>> Publisher.objects.delete()            # 必需加all()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'Manager' object has no attribute 'delete'







相关内容

热门资讯

山西矿难,一场早有预兆的祸事 文丨李一鸣 姜鸥桐 编辑丨卢伊“矿难”“瓦斯爆炸”,这是很多年没有出现在我们视野中的语汇,但它就是这...
朱杨柱、张志远、黎家盈,领命出... ‍‍央视新闻消息,5月24日,神舟二十三号载人飞行任务航天员乘组出征仪式在酒泉卫星发射中心问天阁圆梦...
女子在车厢内大声唱歌、举止怪异... 极目新闻记者 李淑仪5月23日,有网友发视频称,自己乘坐由呼和浩特铁路局承运的K886/K887次列...
天玑7020等于骁龙多少(天玑... 天玑720相当于高通骁龙765G。天玑720采用了台积电7nm制程工艺,EUV是采用波长15nm的极...
坐便器水箱一直流水怎么办 坐便器水箱一直流水可能是由以下原因导致的:1. 水箱配件老化或损坏:水箱内的配件,如浮球、排水阀等,...
安装墙面收纳柜的好处及注意事项 安装墙面收纳柜可以提供合理的收纳空间,色彩和设计上要简洁明快,注意大小和线路布局,选择适合的颜色和灯...
安装中央空调的注意事项 中央空调是现代家庭的常见设备之一,安装中央空调需要注意以下事项: 1.选择合适的品牌和型号 选择...
led灯不亮了但有弱光怎么办 LED灯在使用过程中,容易出现各种故障,比如灯不亮了,但是有弱光,这怎么处理好?小编带大家一起了解下...
轰动性突破!美国终被伊朗逼怂 伊朗局势看来出现了真正的进展,在多方传出美伊谈判立场相互接近后,特朗普北京时间周日凌晨发帖表示,美国...
男子踩中蛇窝,至少被3条毒蛇咬... 5月22日,云南保山市人民医院血液科蛇伤救治中心病房外,26岁的阿杰(化名)在哥嫂的搀扶下,缓缓走出...