大三上,期末课设,要求做一个大型数据库应用,最终展现形式以网页或者小程序。两者我都有所接触,但是出于时间紧迫的原因,没多想就选择了最近碰得比较多的网页来开发。
既然是大型数据库,那mysql就不符合要求了,如下择一:SQL Server、DB2、Oracle。
开发环境
项目主题:图书管理系统
开发语言:Python 3.7
IDE:pycharm 2019
网站架构:Django 2.2
数据库:SQL Server 2017
安装SQL Server
我并不是很想把数据库装在本机,一个原因是本机上已经有mysql数据库了,再者这个数据库很可能是本次的一次性使用。所以我就想到了把它装在我的阿里云服务器上,远程连接使用。结果:安装失败。原因:服务器配置太低,SQL Server要求2GB以上内存才能完成安装。
没死心,继续想办法…
既然云服务器配置不够,那试试把它跑在可随意配置的虚拟机上。我配置了一台两核4GB的centos7虚拟机,结果确实是可以的,安装顺利完成。于是我在本机上安装了SQL Server管理工具:SQL Server Management Studio,但是连接不上虚拟机上的数据库。虚拟机没有外网可直接访问的IP,而实现虚拟机的网络通信有三种方式:仅主机、桥接、NAT。
① Host-only连接方式:让虚拟机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚拟机IP地址位于同一网段。最终结果是新建了一个由所有虚拟机与宿主主机所构成的局域网,但该局域网与宿主主机本身所处的现有局域网是相互独立的,如果不做额外路由设置,这两个局域网之间不会连通,因此新建的局域网可以认为是一个单独从属于当前宿主主机的私有网络,其成员为当前宿主主机和相关的所有虚拟机,这也是Host-only命名的由来。从网络技术上相当于为宿主主机增添了一个虚拟网卡,让宿主主机变成一台双网卡主机(宿主网卡+虚拟网卡)。同时在宿主主机后端加设一个虚拟交换机,让宿主主机和所有虚拟机构成另一个虚拟的局域网。由于具备双网卡,宿主主机可同时参与两个局域网(现有的宿主局域网+新建的虚拟局域网),只不过缺省情况下两个局域网不连通。
② Bridge(桥接):连接方式让虚拟机具有与宿主机不同的各自独立IP地址,但与宿主机保持在同一网段,最终结果是所有虚拟机都加入宿主主机所在的局域网,这与在该局域网中添加入其他宿主主机在效果上没什么区别。从网络技术上相当于在宿主主机前端加设了一个虚拟交换机,然后宿主主机和所有虚拟机共享这个交换机;或者干脆理解成在宿主主机上作点增强,使其兼具一个交换机(当然是虚拟的)功能,供该宿主主机和网段内其他虚拟机使用。
③ NAT连接方式:虽然从表面现象看,虚拟机无自己的IP地址,而是共享宿主主机的IP地址,但技术本质上却是基于Host-only方式的(即,虚拟机还是有自己独立IP地址的,只不过实际中不投入使用),与Host-only方式一样,宿主主机成为双网卡主机,同时参与现有的宿主局域网和新建的虚拟局域网,但由于加设了一个虚拟的NAT服务器,使得虚拟局域网内的虚拟机在对外访问时,完全“冒用”宿主主机的IP地址,这样从外部网络来看,只能看到宿主主机,完全看不到新建的虚拟局域。查阅了很多资料,说要把虚拟机网络设为桥接模式,使虚拟机和主机处于同一网段,经过n久的尝试….最终还是没能连接成功。(原则上来说是可以连接成功的,但是本人愚笨至极,对网络知识了解甚少,于是选择了暂时放弃,还是安分地在本机上装个SQL Server吧!)
安装SQL Server和SQL Server management studio步骤不作赘述
注意:安装SQL Server时记得添加windows用户实例,这样在用管理工具时可用(local)+windows身份验证进行数据库连接
在管理工具里新建数据库、表,并插入相关数据,语法和mysql基本一致。
python连接SQL Server
1. 下载pymssql库
问题1:pymssql库安装失败
从settings->Interpreter中安装失败,用终端pip命令安装也报错!
一开始我以为是镜像源的问题,后来发现竟然是版本问题!
无论从settings还是从pip下载,都会默认下载最新版,但是最新的pymssql版本无法适配,所以通过pip下载的时候必须指定版本范围:pip install “pymssql<3.0”
2. 连接SQL Server
问题2:连接不上SQL Server
连接语句:connect = pymssql.connect(host, port, user, password, database)
等待一段时间后报错,通过万能百度查明原因:未启用SQL Server的TCP/IP协议
第一步:启用协议:打开SQL Server配置管理器->网络配置->选择数据库实例->双击打开TCP/IP协议->设为启用。
第二步:重启SQL Server实例服务:计算机管理->服务与应用->服务->选择SQL Server实例->右键重启服务。
以上两个问题解决!即可连接成功!
如果还是无法连接,可尝试检查防火墙对于SQL Server的状态。
步骤:win+R->Firewall.cpl打开->允许程序或功能通过windows防火墙。发现现有的程序中没有SQL Server,需要把sqlservr.exe添加进来,参考目录D:\SQLServer2017Media\MSSQL14.MSSQLSERVER\MSSQL\Binn\sqlservr.exe,完成。
开发过程
具体的开发过程不作详述,这里记录一些注意事项。
1. html
id属性具有唯一性,若有多个相同的id,只生效第一个。
2. css
margin是指从自身边框到另一个容器边框之间的距离,就是容器外距离。(外边距)
padding是指自身边框到自身内部另一个容器边框之间的距离,就是容器内距离。(内边距)
3. 触发器
SQL Server中inserted表示插入操作的数据,deleted表示删除操作的数据(inserted/deleted.字段名)
MySQL中new表示插入操作的数据,old表示删除操作的数据(new/old.字段名)
4. 参数传递
在url中使用?id=XXX进行传值,后端需用request.GET.get(‘id’)接收,不能用get,更不能用POST
5.借阅证号字段自动递增
在使用SQL Server创建表时,可直接设定字段默认值
如借阅证号可以根据读者的id自动生成:
① 递增生成读者id
② 设定借阅证号为‘M’+七位id
right(参数1,参数2):(参数1)从右往左取(参数2)位
注:这里要求的是‘M’+七位id(如M00000012),所以参数1必须为不为零开头的八位数字,这样运算后的参数1即为10000012,RIGHT表达式取后(参数2:7)为即为0000012。否则,若运算后的参数1为00000012,自动变为12,则RIGHT表达式即为M12,不符合要求。
CREATE TABLE reader |
而在MySQL中,无法在创建表时set默认值,需使用触发器在每次新增读者后更新借阅证号。
create trigger set_card before insert on reader |
concat(参数1,参数2):连接参数1和参数2 |