py_Django的数据库操作
数据库引擎
pymysql 取而代之 ----推荐
2的话pipinstallpymysql
3的话pip3installpymysql
安装完成后用pip3freeze查看一下安装的什么版本之类的
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
$pythonmanage.pymakemigrationspollsstoredasamigration.$pythonmanage.pysqlmigratepolls0001justreturnstheirSQL$pythonmanage.pycheck#thischecksforanyproblemsinyourprojectwithoutmakingmigrationsortouchingthedatabase.$pythonmanage.pymigrateapplythosechangestothedatabase.会自动生成主键_id
pythonmanage.pyshell
基本数据访问
>>>frombooks.modelsimportPublisher>>>p1=Publisher(name='Apress',address='....)>>>p1.save()>>>publisher_list=Publisher.objects.all()>>>publisher_list[<Publisher:Publisherobject>]
`` objects.create()`` 一步完成对象的创建与存储至数据库,就不需要save
>>>p1=Publisher.objects.create(name='Apress',...address='2855TelegraphAvenue',..............
Publisher对象添加一个方法__unicode__()。
fromdjango.dbimportmodelsclassPublisher(models.Model):name=models.CharField(max_length=30)def__unicode__(self):returnself.name
>>>frombooks.modelsimportPublisher>>>publisher_list=Publisher.objects.all()>>>publisher_list[<Publisher:Apress>,<Publisher:O'Reilly>]
因为Publisher模型有一个自动增加的主键id,所以第一次调用save()还多做了一件事: 计算这个主键的值并把它赋值给这个对象实例:
>>>p.id52#thiswilldifferbasedonyourowndata
接下来再调用save()将不会创建新的记录,而只是修改记录内容(也就是 执行UPDATESQL语句,而不是INSERT语句):
>>>p.name='ApressPublishing'>>>p.save()
注意,并不是只更新修改过的那个字段,所有的字段都会被更新。 这个操作有可能引起竞态条件
取出所有记录:
>>>Publisher.objects.all()[<Publisher:Apress>,<Publisher:O'Reilly>]
数据过滤
filter()返回集合
你可以传递多个参数到filter()来缩小选取范围:
>>>Publisher.objects.filter(country="U.S.A.",state_province="CA")[<Publisher:Apress>]
在name和contains之间有双下划线。contains部分会被Django翻译成LIKE语句:
>>>Publisher.objects.filter(name__contains="press")[<Publisher:Apress>]
注意,SQL缺省的=操作符是精确匹配的
SELECTid,name,address,city,state_province,country,websiteFROMbooks_publisherWHEREnameLIKE'%press%';
其他的一些查找类型有:icontains(大小写无关的LIKE),startswith和endswith, 还有range(SQLBETWEEN查询)。 附录C详细描述了所有的查找类型。
`` get()`` 返回单个的对象
>>>Publisher.objects.get(name="Apress")<Publisher:Apress>
如果结果是多个对象,会导致抛出异常,如果查询没有返回结果也会抛出异常:
DoesNotExist:Publishermatchingquerydoesnotexist.
Publisher.DoesNotExist 在你的应用中,你可以捕获并处理这个异常,像这样:
try:p=Publisher.objects.get(name='Apress')exceptPublisher.DoesNotExist:print"Apressisn'tinthedatabaseyet."else:print"Apressisinthedatabase."
数据排序
有序返回查询结果
如果需要以多个字段为标准进行排序(第二个字段会在第一个字段的值相同的情况下被使用到),减号-
表示逆向排序:
>>>Publisher.objects.order_by("-state_province","address")[<Publisher:Apress>,<Publisher:O'Reilly>]
Django让你可以指定模型的缺省排序方式:classMeta,内嵌类。
classPublisher(models.Model):name=models.CharField(max_length=30)def__unicode__(self):returnself.name**classMeta:****ordering=['name']**
“链式”的形式:
>>>Publisher.objects.filter(country="U.S.A.").order_by("-name")[<Publisher:O'Reilly>,<Publisher:Apress>]
限制返回的数据
取出固定数目的记录,剪语句,不支持负索引,但可逆序查询
>>>Publisher.objects.order_by('-name')[0:2]
更新多个对象
更新一条记录
>>>Publisher.objects.filter(id=52).update(name='ApressPublishing')
更新多条记录。
>>>Publisher.objects.all().update(country='USA')#所有Publisher的country字段2#表示受影响的记录条数
注:save()方法,这个方法会更新一行里的所有列。 而某些情况下,我们只需要更新行里的某几列。
删除对象删除数据库中的对象只需调用该对象的delete()方法即可:
>>>p=Publisher.objects.get(name="O'Reilly")>>>p.delete()>>>Publisher.objects.all()[<Publisher:ApressPublishing>]
>>>Publisher.objects.filter(country='USA').delete()#删除部分>>>Publisher.objects.all().delete()#删除所有
为了预防误删除掉某一个表内的所有数据,Django要求在删除表内所有数据时显示使用all()。 否则报错
>>>Publisher.objects.delete()#必需加all()Traceback(mostrecentcalllast):File"<console>",line1,in<module>AttributeError:'Manager'objecthasnoattribute'delete'
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。