想做个简单的报表网站,需要从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>