如何用 python 优雅地完成数据库课设 (施工ing)

Posted shylocks

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用 python 优雅地完成数据库课设 (施工ing)相关的知识,希望对你有一定的参考价值。

0 前言

偶然间发现 Google 收录了学校实验打卡系统的接口,正好要做数据库课设,便拿来作为 environment。
机房居然装了 python ,早就听说 python 写爬虫速度一流,课上的 DDL 做完也闲,便决定用 python 完成这次数据库课设。
项目打包地址

1 爬虫

1.1 HTTP 访问

爬虫访问网页需要 import 一个 HTTP 访问包,由于接口过于简单,直接 GET 请求即可得到数据,连 COOKIES 都不用,直接用 urllib 即可。

url="yoururladdress"
req=urllib.request.Request(url)
resp=urllib.request.urlopen(req)
data=resp.read().decode(\'GBK\')

1.2 爬取内容

爬到的网页需要批量取出两个已知字符串的中间文本,可以使用正则表达式轻松解决,import re 包即可。

w1=\'<td width=\\\'610\\\' height=\\\'25\\\' style=\\\'padding-left:5px;\\\'>\'
w2=\'</td></tr>\'
pat=re.compile(w1+\'(.*?)\'+w2,re.S)
sybz=pat.findall(data)

2 数据库操作

试了好几种包,最后发现还是 pyodbc 好用
pyodbc 官方文档:https://github.com/mkleehammer/pyodbc/wiki

2.1 连接Microsoft SQLServer 2008 R2

首先在命令行中输入 pip install pyodbc 安装 pyodbc 包
打开 SQL server Configuration Manager,选择 SQL Server 网络配置 - MSSQLSERVER 的协议 - TCP/IP

右击属性找到设置的端口,一般是 127.0.0.1:1433

打开 Microsoft SQL Server Management Studio,连接上本地数据库后右击属性,选择安全性,将服务器身份验证中 SQL SERVER 和 WINDOWS 身份验证模式复选栏勾上。

打开左侧个人数据库的属性,选择文件,将 sa 赋予所有者权限

打开安全性 - 登录名 - sa,右击属性给 sa 指定一个密码,并将强制实施密码策略取消选择

选择状态,如图所示,将设置完成:

新建一个 py 文件,输入下列代码(注意将 yourpassword 处改为自己的密码):

import pyodbc
cnxn = pyodbc.connect(\'DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=SPDG;UID=sa;PWD=yourpassword\')
cursor = cnxn.cursor()

随便执行一个命令看看效果:

cursor.execute("SELECT * FROM SPB")
row = cursor.fetchall()
print(row)

2.2 由 E-R 图设计数据库

E-R 图:

建表:

import pyodbc
cnxn = pyodbc.connect(\'DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=SYDK;UID=sa;PWD=test\')
cursor = cnxn.cursor()
cursor.execute("""
                Create Table XSB
                (
                    班级 varchar(20),
                    学号 char(11),
                    姓名 varchar(20)
                )
                """)#学生表
cursor.execute("""
                Create Table KCB
                (
                    课程代码 varchar(20),
                    课程名称 varchar(255),
                    开课学院 varchar(20)
                )
                """)#课程表
cursor.execute("""
                Create Table JSB
                (
                    姓名 varchar(20),
                    联系电话 varchar(20)
                )
                """)#教师表
cursor.execute("""
                Create Table SYXXB
                (
                    实验编号 varchar(20),
                    课程代码 varchar(20),
                    实验项目 varchar(20),
                    上课老师 varchar(20),
                    辅助教师 varchar(20),
                    上课日期 varchar(255),
                    星期几 varchar(20),
                    实验中心 varchar(255),
                    实验分室 varchar(255),
                    上课地点 varchar(255)
                )
                """)#实验信息表
cursor.execute("""
                Create Table SYDKB
                (
                    实验编号 varchar(20),
                    学号 varchar(20),
                    实际上课时间 varchar(255),
                    状态 varchar(255)
                )
                """)#实验打卡表
cursor.commit()
cursor.close()

爬数据插入表:
这里注意避免在调试过程中插入重复的表值,以及老师姓名后也存在打卡时间的情况。

import urllib.request
import pyodbc
import re
for i in range(33102,33300):
    cnxn = pyodbc.connect(\'DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=SYDK;UID=sa;PWD=test\')
    cursor = cnxn.cursor()
    cursor.execute("SELECT * FROM SYXXB WHERE 实验编号="+str(i))
    row = cursor.fetchall()
    print(i)
    if (len(row)!=0):
        cursor.close()
        continue
    url=
    try:
        req=urllib.request.Request(url)
        resp=urllib.request.urlopen(req)
    except:
        print("oppops")
        continue
    data=resp.read().decode(\'GBK\')
    w1=\'<td width=\\\'610\\\' height=\\\'25\\\' style=\\\'padding-left:5px;\\\'>\'
    w2=\'</td></tr>\'
    pat=re.compile(w1+\'(.*?)\'+w2,re.S)
    sybz=pat.findall(data)
    if(len(sybz)==0):
        continue
    del(sybz[9])
    w1=\'<td height=\\\'25\\\' style=\\\'padding-left:5px; width: 82px;\\\'>\'
    w2=\'</td>\'
    pat2=re.compile(w1+\'(.*?)\'+w2,re.S)
    syb=pat2.findall(data)
    del(syb[9])
    for j in range(0,len(syb)):
        print (syb[j]+\':\'+sybz[j])
    if(sybz[4].find("(")!=-1):
        tmp=sybz[4]
        tmp=tmp[0:tmp.find("(")]
        sybz[4]=tmp
    w1=\'<td align=\\\'center\\\'>\'
    w2=\'</td>\'
    pat3=re.compile(w1+\'(.*?)\'+w2,re.S)
    xsbz=pat3.findall(data)
    #print(xsbz)
    xsb=xsbz[0:5].copy()
    for j in range(0,5):
        del xsbz[0]
    for j in range(len(xsbz)):
        xsbz[j] = xsbz[j].replace(\'<font color=\\\'red\\\'>\', \'\')
        xsbz[j] = xsbz[j].replace(\'</font>\', \'\')
    cursor.execute("SELECT * FROM JSB WHERE 姓名=\\\'"+sybz[4]+"\\\'")
    row = cursor.fetchall()
    if (len(row)==0):
        cursor.execute("insert into JSB values ("+"\\\'"+sybz[4]+"\\\'"+",\\\'"
                   +sybz[5]+"\\\'"+")")
    cursor.execute("SELECT * FROM KCB WHERE 课程代码="+sybz[0])
    row = cursor.fetchall()
    if (len(row)==0):
        cursor.execute("insert into KCB values ("+"\\\'"+sybz[0]+"\\\'"+",\\\'"
                   +sybz[1]+"\\\'"+",\\\'"+sybz[2]+"\\\'"+")")
    cursor.execute("SELECT * FROM SYXXB WHERE 实验编号="+str(i))
    row = cursor.fetchall()
    if (len(row)==0):
        cursor.execute("insert into SYXXB values ("+"\\\'"+str(i)+"\\\'"+",\\\'"+sybz[0]+"\\\'"+",\\\'"
                   +sybz[3]+"\\\'"+",\\\'"+sybz[4]+"\\\'"+",\\\'"+sybz[6]+"\\\'"+",\\\'"
                   +sybz[7]+"\\\'"+",\\\'"+sybz[8]+"\\\'"+",\\\'"+sybz[9]+"\\\'"+",\\\'"
                   +sybz[10]+"\\\'"+",\\\'"+sybz[11]+"\\\'"+")")
    cursor.execute("SELECT * FROM SYDKB WHERE 实验编号="+str(i))
    row = cursor.fetchall()
    if (len(row)==0):
        for j in range(0,int(len(xsbz)/5)):
            cursor.execute("insert into SYDKB values ("+"\\\'"+str(i)+"\\\'"+",\\\'"
                       +xsbz[j*5+1]+"\\\'"+",\\\'"+xsbz[j*5+3]+"\\\'"+",\\\'"
                       +xsbz[j*5+4]+"\\\'"+")")
    for j in range(0,int(len(xsbz)/5)):
        cursor.execute("SELECT * FROM XSB WHERE 学号="+xsbz[j*5+1])
        row = cursor.fetchall()
        if (len(row)==0):
            cursor.execute("insert into XSB values ("+"\\\'"+xsbz[j*5+0]+"\\\'"+",\\\'"
                       +xsbz[j*5+1]+"\\\'"+",\\\'"+xsbz[j*5+2]+"\\\'"+")")
    cursor.commit()
    cursor.close()

以上是关于如何用 python 优雅地完成数据库课设 (施工ing)的主要内容,如果未能解决你的问题,请参考以下文章

如何用EXCEL制作施工进度计划表

如何用python做数据分析

如何用Python优雅的合并两个Dict

如何用 flask 优雅的实现 restful api

Java 8 Optional:优雅地避免 NPE

如何用jquery优雅的给dom绑定监听事件