这是一篇实验过程记录
环境:
1.Pycharm 专业版
2.Python3.6.3
3.Django2.1.1
4.Sql Server2012企业版
各种环境搭建:
Python环境搭建:https://www.runoob.com/python/python-install.html
Pycharm的安装:https://blog.csdn.net/qsir/article/details/79362549
(对于学生,可以通过官网认证,完成认证就可以免费使用专业版了,一般要一年认证一次)
Pycharm下的Django入门(包括安装和环境配置):https://blog.csdn.net/Sunshine_ZCC/article/details/73918408
开始做实验
以下仅为个人完成实验关键步骤的记录
1.新建django项目
2.连接远程Sql Server
因为Django并不直接支持Sql Server,所以需要安装这些包:
直接在Pycharm的控制太台用”pip install package_name”命令即可
然后修改setting.py:
3.创建APP
控制台输入“python manage.py startapp app_name”
然后会自动生成相应的APP文件夹,下图是我创建的名为Log的APP
4.从数据库中导入已经存在的表模型,以供后台使用
控制台输入:python manage.py inspectdb
然后你就会在控制台看到数据库中已有表格的models:
然后在控制台输入:python manage.py inspectdb > App_name/models.py
就会将这些models导进你对应APP的models.py中,完成之后你就可以在这个文件夹里看到映射过来的model了:
完成映射之后就可以在你的项目里面使用啦
(这一步我纠结了好久,不知道怎么映射已有的表格,废了好多时间·····)
5.批量导入数据
5.1导入(.xlsx)
为了导入excel表格们需要先安装xlrd包,在控制台输入:“pip install xlrd”命令即可
然后记得在使用时import这个包
data = xlrd.open_workbook(r'C:\Users\wansh\Desktop\tbCell.xlsx')
#打开要导入的表格,这里我写的绝对路径,
table = data.sheet_by_index(0)
#从表格中读入数据
successLines= 1
#我设置的用于记录成功导入行数的计数器
workList = []
#用于存放每一行数据的列表
failLines = 0
#用于记录导入失败的行数的计数器
for line in range(1, table.nrows):
#从第一行开始,到最后一行,这里的第一行是指除去表头之后
#table.nrows就是整个表的行数
row = table.row_values(line)
#获取一行的数据
if row:
#检查是否为空行
if (type(row[0]) == str and type(row[1]) == str and type(row[2]) == str
and type(row[3]) == float and row[3] % 1 == 0 and type(row[4]) == str
and type(row[5]) == float and row[5] % 1 == 0
and type(row[6]) == float and row[6] % 1 == 0 and type(row[7]) == float and row[7] % 1 == 0
and type(row[8]) == float and row[8] % 1 == 0
and type(row[9]) == float and row[9] % 1 == 0 and type(row[10]) == str
and type(row[11]) == float
and type(row[12]) == float and type(row[13]) == str and type(row[14]) == float
and type(row[15]) == float and type(row[16]) == float and type(row[17]) == float
#判断数据类型和数据库中的是否一致,为的是保证数据库不崩溃
#这里有一个我自己发现的小技巧
#因为无法直接判断excel中的数据是否为整型
#经过我的反复尝试后可以等价于判断这个单元格里的数据是否为float型,并且对1取模等于0
workList.append(Tbcell(city=row[0],
sector_id=row[1],
sector_name=row[2],
enodebid=row[3],
enodeb_name=row[4],
earfcn=row[5],
pci=row[6],
pss=row[7],
sss=row[8],
tac=row[9],
vendor=row[10],
longitude=row[11],
latitude=row[12],
style=row[13],
azimuth=row[14],
height=row[15],
electtilt=row[16],
mechtilt=row[17],
totletilt=row[18]))
#将excel中每一列的数据和数据库表格中的属性进行绑定
#TbCell是一个model
#workList.append()就是绑定列属性的函数
successLines = successLines + 1
else:
failLines = failLines + 1
print("有数据类型不对")
else:
failLines = failLines + 1
print("出现空行!")
if successLines % 1000 == 0 or successLines + failLines >= table.nrows:
#每1000行进行一次插入,或者最后一批不足1000行时插入
Tbcell.objects.bulk_create(workList)
#批量插入
workList = []
#插入后将工作列表进行清空
5.2导入(.csv)
table = open(r'C:\Users\wansh\Desktop\tbMROData.csv')
#打开表格读入数据
#其实所谓csv就是用逗号分隔
#所以这样读出来的每一行数据中每个单元格内容是用“,”分隔开的
print("读取文件结束,准备导入!")
successLines = 1
workList = []
next(table)
#这里是为了将指针下移一行,不读取表头
failLines = 0
for line in table:
row = line.split(",")
#利用逗号将每一行数据进行分隔
workList.append(Tbmrodata(timestamp=row[0], servingsector=row[1], interferingsector=row[2],
ltescrsrp=int(row[3]), ltencrsrp=int(row[4]), ltencearfcn=int(row[5]),
ltencpci=int(row[6]))
)
#绑定列属性
successLines = successLines + 1
if successLines % 10000 == 0: # 每10000行进行一次插入
print("已插入到")
print(successLines)
Tbmrodata.objects.bulk_create(workList)
workList = []
Tbmrodata.objects.bulk_create(workList)
#插入最后的行
5.3字符串转datetime
#date转化前是字符串
#需要import datetime这个包
date = "07/12/2016 00:00:00"
date = datetime.strptime(row[0], "%m/%d/%Y %X")
日期各种格式如下:
%a 星期的简写。如 星期三为Web
%A 星期的全写。如 星期三为Wednesday
%b 月份的简写。如 4月份为Apr
%B 月份的全写。如 4月份为April
%c 日期时间的字符串表示。如:04/07/10 10:43:39
%d 日在这个月中的天数(是这个月的第几天)
%f 微秒(范围[0,999999])
%H 小时(24小时制,[0, 23])
%I 小时(12小时制,[0, 11])
%j 日在年中的天数 [001,366](是当年的第几天)
%m 月份([01,12])
%M 分钟([00,59])
%p AM或者PM
%S 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~)
%U 周在当年的周数当年的第几周),星期天作为周的第一天
%w 今天在这周的天数,范围为[0, 6],6表示星期天
%W 周在当年的周数(是当年的第几周),星期一作为周的第一天
%x 日期字符串(如:04/07/10)
%X 时间字符串(如:10:43:39)
%y 2个数字表示的年份
%Y 4个数字表示的年份
%z 与utc时间的间隔 (如果是本地时间,返回空字符串)
%Z 时区名称(如果是本地时间,返回空字符串)
%% %号本身
5.4使用map和eval进行批量字符串转浮点型或整型
row = ['abc', 'def', 'ghi','11'