天天看点

django与mysql交互

查看ubuntu已安装的所有软件:

<code>dpkg -l  </code>

<code>dpkg -l | </code><code>grep</code> <code>mysql</code>

查看软件安装的路径

<code>dpkg -L | </code><code>grep</code> <code>mysql</code>

查看开机启动的软件,需要额外安装插件:

<code>sudo</code> <code>apt-get </code><code>install</code> <code>rcconf</code>

<code>rcconf</code>

<code>更能全一点的:</code>

<code>sudo</code> <code>apt-get </code><code>install</code> <code>sysv-rc-conf</code>

<code>sysv-rc-conf</code>

安装mysql:

<code># apt-get install python-setuptools libmysqld-dev libmysqlclient-dev </code>

<code># easy_install mysql-python</code>

<code>或者 </code><code>#pip install mysql-python</code>

django setting配置:

<code>DATABASES </code><code>=</code> <code>{</code>

<code>    </code><code>'default'</code><code>: {</code>

<code>        </code><code>'ENGINE'</code><code>: </code><code>'django.db.backends.mysql'</code><code>, </code>

<code>        </code><code>'NAME'</code><code>: </code><code>'books'</code><code>,  </code><code>#你的数据库名称</code>

<code>        </code><code>'USER'</code><code>: </code><code>'root'</code><code>,  </code><code>#你的数据库用户名</code>

<code>        </code><code>'PASSWORD'</code><code>: '',   </code><code>#你的数据库密码</code>

<code>        </code><code>'HOST'</code><code>: '',       </code><code>#你的数据库主机,留空默认为localhost</code>

<code>        </code><code>'PORT'</code><code>: </code><code>'3306'</code><code>,   </code><code>#你的数据库端口</code>

<code>    </code><code>}</code>

<code>}</code>

在model模块中添加如下建表语句:

vi app/models.py

<code>class</code> <code>test1(models.Model):    </code>

<code>    </code><code>name </code><code>=</code> <code>models.CharField(max_length</code><code>=</code><code>20</code><code>)   </code><code>#定义的字段name为字段名</code>

model模块在app中,其中定义的类名就是表名(但是在数据库中的表名会以app为前缀,例如项目为app则实际创建的表名为app_test1),CharField相当于varchar,DateField相当于datetime,max_length 相当于参数限定长度“varchar(20)”

<code>python manage.py makemigrations    </code><code>#查看表有哪些更改</code>

<code>python manage.py migrate app     </code><code>#创建表结构</code>

注意:这里如果之前已经同步过一次数据,现在又要添加字段,会报错,解决办法是在字段后面添加

null=True

例如:

为表添加数据:django需要查询或者更新表时,需先导入表名才能获取表内的数据。

<code>from</code> <code>app.models </code><code>import</code> <code>test1</code>

<code>def</code> <code>huoqu(request):    </code>

<code>   </code><code>a </code><code>=</code> <code>test1(name</code><code>=</code><code>'wangjiadongge'</code><code>)     </code><code>#test1为表名,name为字段名。</code>

<code>   </code><code>a.save()</code>

<code>   </code><code>return</code> <code>HttpResponse(</code><code>"数据添加成功!"</code><code>)</code>

数据操作:

<code>#获取数据</code>

<code>def</code> <code>huoqu(request):  </code>

<code>    </code> 

<code>    </code><code>#通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM</code>

<code>    </code><code>list</code> <code>=</code> <code>test1.objects.</code><code>all</code><code>()    </code>

<code>    </code><code>#filter相当于SQL中的WHERE,可设置条件过滤结果</code>

<code>    </code><code>list1 </code><code>=</code> <code>test1.objects.</code><code>filter</code><code>(</code><code>id</code><code>=</code><code>1</code><code>) </code>

<code>    </code><code>#获取单个对象</code>

<code>    </code><code>list2 </code><code>=</code> <code>test.objects.get(</code><code>id</code><code>=</code><code>1</code><code>) </code>

<code>    </code><code>#限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;</code>

<code>    </code><code>test1.objects.order_by(</code><code>'name'</code><code>)[</code><code>0</code><code>:</code><code>2</code><code>]</code>

<code>    </code><code>#数据排序</code>

<code>    </code><code>test1.objects.order_by(</code><code>"id"</code><code>)</code>

<code>    </code><code>#上面的方法可以连锁使用</code>

<code>    </code><code>test1.objects.</code><code>filter</code><code>(name</code><code>=</code><code>"runoob"</code><code>).order_by(</code><code>"id"</code><code>)</code>

<code>    </code><code>#输出所有数据</code>

<code>    </code><code>for</code> <code>var </code><code>in</code> <code>list</code><code>:        response1 </code><code>+</code><code>=</code> <code>var.name </code><code>+</code> <code>" "</code>

<code>    </code><code>response </code><code>=</code> <code>response1</code>

<code>    </code><code>return</code> <code>HttpResponse(</code><code>"&lt;p&gt;"</code> <code>+</code> <code>response </code><code>+</code> <code>"&lt;/p&gt;"</code><code>)</code>

<code>#更新数据</code>

<code># -*- coding: utf-8 -*-</code>

<code> </code><code>from</code> <code>django.http </code><code>import</code> <code>HttpResponse</code>

<code> </code><code>from</code> <code>app.models </code><code>import</code> <code>test1</code>

<code> </code><code>def</code> <code>testdb(request):    </code><code>#修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE</code>

<code>    </code><code>test </code><code>=</code> <code>test1.objects.get(</code><code>id</code><code>=</code><code>1</code><code>)</code>

<code>    </code><code>test.name </code><code>=</code> <code>'Google'</code>

<code>    </code><code>test.save()</code>

<code>    </code><code>#另外一种方式</code>

<code>    </code><code>#test1.objects.filter(id=1).update(name='Google')</code>

<code>    </code><code># 修改所有的列</code>

<code>    </code><code># test1.objects.all().update(name='Google')</code>

<code>    </code><code>return</code> <code>HttpResponse(</code><code>"&lt;p&gt;修改成功&lt;/p&gt;"</code><code>)</code>

<code>#删除数据</code>

<code> </code><code>from</code> <code>app.models </code><code>import</code> <code>Test</code>

<code> </code><code># 数据库操作def testdb(request):    # 删除id=1的数据</code>

<code>    </code><code>test1 </code><code>=</code> <code>Test.objects.get(</code><code>id</code><code>=</code><code>1</code><code>)</code>

<code>    </code><code>test1.delete()</code>

<code>    </code><code>#test1.objects.filter(id=1).delete()</code>

<code>    </code><code>#删除所有数据</code>

<code>    </code><code>#test1.objects.all().delete()</code>

<code>    </code><code>return</code> <code>HttpResponse(</code><code>"&lt;p&gt;删除成功&lt;/p&gt;"</code><code>)</code>

#django在前端中展示从数据库中获取到的数据:

html:

<code>{% for a in names %}</code>

<code>    </code><code>id={{ a.id }}:name={{ a.name }}:sex={{ a.sex }}</code>

<code>{% endfor %}</code>

注意:这里展示的数据必须是单条数据,若是展示整个数据库的内容必须是逐条,整个取的话会导致出现QuerySet [&lt;test2: test2 object&gt;这种数据。

django:

<code>def</code> <code>testdb(request):</code>

<code>   </code> 

<code>    </code><code>#list = test2.objects.all()</code>

<code>    </code><code>names </code><code>=</code> <code>test2.objects.</code><code>filter</code><code>(</code><code>id</code><code>=</code><code>1</code><code>)</code>

<code>    </code><code>print</code> <code>names</code>

<code>    </code><code>#return HttpResponse('this is test select mysql!')</code>

<code>    </code><code>return</code> <code>render_to_response(</code><code>'a.html'</code><code>,</code><code>locals</code><code>())  </code><code>#locals()是获取整个本地变量</code>

-------------------分割线--------------------

#django经典例子:

<code>from</code> <code>django.db </code><code>import</code> <code>models        </code><code>#导入models模块</code>

<code>#表名:</code>

<code>class</code> <code>publisher(models.Model):        </code><code>#定义表名为publish</code>

<code>    </code><code>name</code><code>=</code><code>models.CharField(max_length</code><code>=</code><code>30</code><code>)     </code><code>#表字段name</code>

<code>    </code><code>address</code><code>=</code><code>models.CharField(max_length</code><code>=</code><code>50</code><code>)  </code><code>#表字段address</code>

<code>    </code><code>city</code><code>=</code><code>models.CharField(max_length</code><code>=</code><code>60</code><code>)     </code><code>#表字段city</code>

<code>    </code><code>state_province</code><code>=</code><code>models.CharField(max_length</code><code>=</code><code>30</code><code>)   </code>

<code>    </code><code>county</code><code>=</code><code>models.CharField(default</code><code>=</code><code>"CN"</code><code>,max_length</code><code>=</code><code>50</code><code>)</code>

<code>    </code><code>website</code><code>=</code><code>models.URLField()          </code><code>#表字段website,字段类型为地址</code>

<code>表名:</code>

<code>class</code> <code>author(models.Model):</code>

<code>    </code><code>first_name</code><code>=</code><code>models.CharField(max_length</code><code>=</code><code>30</code><code>)</code>

<code>    </code><code>last_name</code><code>=</code><code>models.CharField(max_length</code><code>=</code><code>40</code><code>)</code>

<code>    </code><code>email</code><code>=</code><code>models.EmailField(blank</code><code>=</code><code>True</code><code>)     </code><code>#字段名字为email,字段类型为email</code>

<code>class</code> <code>book(models.Model):</code>

<code>    </code><code>title</code><code>=</code><code>models.CharField(max_length</code><code>=</code><code>100</code><code>)     </code><code>#字段名为title,字段类型为vachar</code>

<code>    </code><code>authors</code><code>=</code><code>models.ManyToManyField(author)     </code><code>#字段名为author,字段类型为ManyToManyField</code>

<code>    </code><code>publisher</code><code>=</code><code>models.ForeignKey(publisher)     </code><code>#关联外部表publisher</code>

<code>    </code><code>publication_date</code><code>=</code><code>models.DateField()        </code><code>#字段名为publication_date,类型为日期类型</code>

<code>python manage.py makemigrations     </code><code>#查看表有哪些更改</code>

<code>python manage.py migrate     </code><code>#同步数据库</code>

<code>#运行上面这条命令出现的错误:</code>

<code>#Apply all migrations: admin, app, auth, contenttypes, sessions</code>

<code>#Running migrations:</code>

<code>#解决:这个错误是因为已经同步过一次数据库引起的,如果表中的字段要增加,需要添加null=True</code>

<code>#比如:ages=models.CharField(max_length=10,null=True)</code>

<code>#如果是新建一个表,则要删除app中migrations文件夹(一般不需要)。</code>

#如果需要用户和密码,则执行:

<code>python manage.py createsuperuser   </code><code>#创建用户</code>

<code>python manage.py changepassword    </code><code>#更改密码</code>

#练习在python交互模式下操作数据库:

<code>.</code><code>/</code><code>manage.py shell              </code><code>#进入django变量的交互器</code>

<code>from</code> <code>app.models </code><code>import</code> <code>publisher </code><code>#导入publisher数据库。</code>

#插入一条数据:

<code>p1</code><code>=</code><code>publisher(name</code><code>=</code><code>'qinghua university'</code><code>,address</code><code>=</code><code>'wudaokou'</code><code>,city</code><code>=</code><code>'beijing'</code><code>,state_province</code><code>=</code><code>'beijing'</code><code>,county</code><code>=</code><code>'china'</code><code>,website</code><code>=</code><code>'www.qinghua.com'</code><code>)</code>

p1.name    #查看插入的name

p1.address  #查看插入的address

p1.save()   #插入的数据写入数据库中

#更新一条数据:

<code>p1.address</code><code>=</code><code>"qinghualu"</code>

<code>p1.save()</code>

#查看所有的数据

在models模块中,建表语句下面添加如下:

<code>def</code> <code>__unicode__(</code><code>self</code><code>):</code>

<code>    </code><code>return</code> <code>self</code><code>.name,</code><code>self</code><code>.address</code>

然后再去交换窗口查看所有数据:

<code>publisher.objects.</code><code>all</code><code>()</code>

#查询国家等于中国的一条数据:

<code>publisher.objects.</code><code>filter</code><code>(country</code><code>=</code><code>"china"</code><code>)</code>

#查询出来的数据进行更改:

<code>a</code><code>=</code><code>publisher.objects.get(name</code><code>=</code><code>"beijing"</code><code>)</code>

<code>a.county</code><code>=</code><code>"USA"</code>

<code>a.save()</code>

#高效的更新数据方式,并且无需save:

<code>publisher.objects.</code><code>filter</code><code>(</code><code>id</code><code>=</code><code>1</code><code>).update(name</code><code>=</code><code>"qingdaodaxue"</code><code>)</code>

#在浏览器中打开后台管理数据库界面:

http://192.168.110.106/admin/

账号就是同步数据库时创建的用户名和密码,登陆进去。

在app下创建一个admin.py的文件

vi admin.py

<code>from</code> <code>django.contrib </code><code>import</code> <code>admin</code>

<code>from</code> <code>app.models </code><code>import</code> <code>publisher,author,book</code>

<code>admin.site.register(publisher)</code>

<code>admin.site.register(author)</code>

<code>admin.site.register(book)</code>

完成后,重新打开页面。

#django中引用bootstrap:

在setting.py中:

MEDIA_ROOT='/root/project/statics/bootstrap/'

在url.py中:

from django.conf import settings

--------------------------------------分割线------------------------------------

本文转自 王家东哥 51CTO博客,原文链接:http://blog.51cto.com/xiaodongge/1903793