python学习笔记14 django 多数据库操作实例

3 篇文章 0 订阅

想做个简单的报表网站,需要从sqlserver读取数据,现django初始化自带一个sqlite3.db,我想保留这个数据库功能(能用后台建表),另外从sqlserver读取数据。

下方的实例对于数据展示还不完善,可能把数据变成字典形式会更好一些。后面有时间我会在优化。

研究了一下,可以这样操作:
1.安装pymssql,装完以后可以自己建个test.py试试是否ok。
这里数据库的表test可以自己建。

import pymssql
import os
#conn是连接设置,其中host也可以是数据库ip
conn = pymssql.connect(host=r'host', user='sa', password='111', database='test')
#连接数据库
cur = conn.cursor()
#执行语句
sql='select top 10 * from test'
cur.execute(sql)
#fetchall()获取的是除了列名以外的行数据
show = cur.fetchall()
#这个是列名数据
index=cur.description
rowname=[]
print(cur.description[0][0])
#取列名
for i in range(len(index)):
    rowname.append(cur.description[i][0])
print(rowname)
print(show)

2.django内的操作,先models里添加一个数据库操作类

class Dbconn(models.Model):
    def Chosedbconn(sql,datebase='test'):

        conn = pymssql.connect(host=r'dsn\test', user='sa', password='123', database=datebase)
        cur = conn.cursor()
        cur.execute(sql)
        show = cur.fetchall()
        index = cur.description
        rowname = []
        #print(cur.description[0][0])
        for i in range(len(index)):
            rowname.append(cur.description[i][0])
        return rowname,show

3.views里添加绑定数据和页面的方法

from .models import Dbconn

def base(request):
    sql = (r'select top 10 * from test')
    a,b = Dbconn.Chosedbconn(sql)
    template=get_template("base.html")

    return HttpResponse(template.render(locals()))

4.添加url

from qp1 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/',views.hello,name='hello'),
    path('',views.homepage,name='homepage'),
    path('post/<slug>/',views.showpost),
    path('db/',views.db,name='db'),
    #添加url
    path('base/',views.base,name='base')
]

5.在template里面添加base.html展示页面。里面的a,b分别是数据库里的列名和行数据,如何像一个正常表格一样展示要考虑一下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>showtime</title>
</head>
<body>
<table>
<tr>
{% for line in a %}
    <td>{{ line }}</td>
    {% endfor %}
    </tr>

    {% for col in b %}
    <tr>
         <td>{{ col }}</td>
          </tr>
    {% endfor %}

</table>

</body>
</html>

补充,通过以上步骤后会发现展示的内容中中文是乱码,且展示不完全,故进行了以下优化。
1.展示所有sql数据。通过把sql中的数据存入字典中再引出可以实现。
2.解决中文乱码,乱码应该是sql本身编码就有问题要先转换再读取到python中。
改完以后效果如下:
在这里插入图片描述

相关文件如下:
models.py

#-*-coding:utf-8-*-
from django.db import models
from django.utils import timezone
import pymssql


class Dbconn(models.Model):

    def Chosedbconn(sql,datebase='test'):

        conn = pymssql.connect(host=r'host', user='sa', password='111', database=datebase)
        cur = conn.cursor()
        cur.execute(sql)
        show = cur.fetchall()
        showall=[]
        index = cur.description
        for i in range(len(show)):
            showall.append({'id': show[i][0], 'name': show[i][1], 'pro': show[i][2]})
        rowname = []
        #print(cur.description[0][0])
        for i in range(len(index)):
            rowname.append(cur.description[i][0])
        return rowname,showall

views.py

def base(request):
# 这里的转换特别重要
    sql = (r'select top 10 id,a,convert(nvarchar(5),b) b from test')
    a,b = Dbconn.Chosedbconn(sql)
    template=get_template("base.html")

    return HttpResponse(template.render(locals()))

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>showtime</title>
</head>
<body>
<table align="center" width="250" border="2" encoding="Utf-8" >
<tr>
{% for line in a %}
    <td>{{ line }}</td>
    {% endfor %}
    </tr>

    {% for col in b %}

    <tr>
         <td>{{ col.id }}</td>
        <td>{{ col.name }}</td>
        <td>{{ col.pro }}</td>
          </tr>



    {% endfor %}

</table>

</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值