基于Django的微信公众号开发(4) -- 配置云数据库和本地测试库

来源:互联网 发布:淘宝店logo生成器 编辑:程序博客网 时间:2024/05/16 10:49

这篇说的是在新浪云中配置共享数据库,跟配置测试库.同时会说一下怎么用vpn连接在云上的数据库


为什么选择共享型数据库?

新浪云数据库有很多种, 但是根据我的这个项目来看, 需要储存的东西不多, 并且不会有太频繁的改变, 也没有大量的增删改, 所以我选择了mysql. 这是一点; 另外一点就是我没钱T T, 对比价格, 独享型数据库有很强大的功能(具体可以看他们介绍),但是很贵(最低配都要1.44每天).共享数据库只有一些基本的增删改查的功能,但是价格则是0.48一天(0.02每小时),其他按访问收费,我们不需要花大价钱去购买一个多功能的独享,我只需要满足我现在的就可以了.


怎么配置共享型数据库

怎么配置完全是傻瓜式的, 进入应用的管理页面之后, 点击"数据库与缓存服务->共享型MySQL->创建MySQL", 然后按提示操作就可以了. 这个略过不提,不懂的可以百度一下.

另外,在点击"管理"进入管理页面后, 如果你有玩过phpmyadmin的话, 你会发现sae的共享数据库管理页跟这个大致相同. 但是你要注意, 如果你有大量的数据要导入, 或者更改或者删除, 不要用这个界面自带的导入功能, 而是按照提示用sae自己开发的导入系统, 不然会导致mysql数据库不可用.

在你配置完成之后, 他会给你创建两个数据库, 一个主库, 一个从库. 怎么本地访问这两个数据库跟用代码连接后面会提到


本地连接共享数据库

为了安全起见, sae不允许直接用mysql管理软件从Internet连接, 而是你需要申请一条连接sae数据库服务器的vpn连接, 你需要用特定的工具连接(在sae应用管理 → 网络与安全服务 → vpn隧道中有链接下载, 直接选择对应操作系统下载即可, 怎么使用也有文档介绍), 这里有一点需要注意, 一定要用管理员模式运行这个连接工具! 否则即使显示连接成功, 数据库还是访问不了的!
连接vpn需要的用户名和密码在sae应用管理 → 网络与安全服务 → vpn隧道中可以看到, (由于用户名跟密码都是按一定算法的乱序码, 又长又难记, 最烦的是连接工具每次登陆都需要输入, 很不方便, 但是不得不说这保证了安全)


搞定之后, 点击"启动vpn隧道"(4分钱/小时 谢谢), 所以用完请记得及时关闭!

本地配置测试库

除了云应用的数据库之外, 为了方便我们调试, 我们还应该建立一个测试库, 用于程序的调试.
我们在本机配置好跟云共享数据库相同版本的mysql5.6. 还有安装mysqldb1.2.3.
我们安装完后给新建一个数据库, 用作测试库. 
最后我们安装一个Navicat for MySQL
搞定后请看下面~~

Navicat连接数据库

Navicat这个软件怎么用我就不说了, 看不懂英文的还有全中文版, 界面也简单没啥可说.
这里就说说我们怎么获取云共享数据库的连接参数.
我们点开数据库与缓存服务→共享型MySQL→(数据库列表里)有个详情的.


点开它,你会发现这个.

然后就连接吧~

其实, 如果你需要修改数据库, 你只需要把云数据库其中一个改了就可以, 他会自动更新到另一个库里的.

代码连接数据库

sae有API 用于获取Mysql的连接信息的,需要我们下载一个sae的包
pip install sae_python_dev-1.3.6-py2.7
怎么获取?我从官方文档截了个图

(注意! 端口哪里直接写3306就好了, 自动获取又要转换成int, 效率低)
需要留意的是, 每次mysql的连接超时时间是30秒
# coding:utf-8__author__ = 'yuuuuchang'import osos.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'os.environ['NLS_CHARACTERSET'] = 'AL32UTF8'import MySQLdbfrom sae.const import (MYSQL_HOST, MYSQL_HOST_S, MYSQL_USER, MYSQL_PASS, MYSQL_DB)class ConnDB:""" 操作mysql数据库的类 """def __init__(self, host='localhost', port=3306, db_name='app_yuuuuchang', user='root', password='123456',             charset='utf8'):"""连接mysql相关参数(默认赋值测试库连接信息):paramshost                存放数据库的主机地址port                端口号,默认3306db_name             数据库名user                用户password            密码charset             编码(默认utf-8):varsself.conn           默认连接的对象实例(本地, 或者是主库)self.conn_s         对象实例(从库)self.cur            游标连接数据库如果是本地环境,则sae.MYSQL_DB只会获得'app_'的前缀,到实际的运行环境则会获得'app_'+应用名.那么我现在获取sae.MYSQL_DB!='app_yuuuuchang'的话,我就连接本地库,否则就连接云主从库.(主库用来增删改,从库用来查):returns    连接成功:   对 self.conn(和self.conn_s) 赋予连接实例连接失败:   抛出错误"""self.conn = Noneself.conn_s = Noneself.cur = Noneif MYSQL_DB == 'app_yuuuuchang':self.conn = MySQLdb.connect(user=MYSQL_USER,passwd=MYSQL_PASS,db=MYSQL_DB,port=3306,host=MYSQL_HOST,charset=charset)self.conn_s = MySQLdb.connect(user=MYSQL_USER,passwd=MYSQL_PASS,db=MYSQL_DB,port=3306,host=MYSQL_HOST_S,charset=charset)else:self.conn = MySQLdb.connect(port=port,host=host,user=user,passwd=password,db=db_name,charset=charset)def select(self, que, use_db=None):"""查询数据思路:如果self.conn_s不为 None, 则表明当前是在云服务器上, 那么我就在云从库上查询;如果conn_s为None, 则表明是在本地, 那么就用本地库进行查询如果追求查询速度,那么就限定在云主库上进行查询 (use_db='mdb'):paramuse_db  对哪一个数据库进行查询?(默认不用填, 指定用主库则填'mdb')que   查询语句:return成功查询:   建立一个查询后的游标,并返回'ok'查询失败:   self.cur变回None并抛出错误"""if not self.conn_s or use_db == 'mdb':use_db = self.connelse:use_db = self.conn_stry:self.control(use_db, que)except:self.cur = Nonereturn 'ok'def insert(self, que):"""添加数据到数据库:paramque: 语句:return成功: 操作成功,返回'ok'失败: 抛出自定义错误"""self.control(self.conn, que)return 'ok'def update(self, que):"""修改数据:paramque: 语句:return成功: 操作成功,返回'ok'失败: 抛出自定义错误"""self.control(self.conn, que)return 'ok'def delete(self, que):"""删除数据:paramque: 语句:return成功: 操作成功,返回'ok'失败: 抛出自定义错误"""self.control(self.conn, que)return 'ok'def close(self):"""关闭所有游标跟数据库连接"""if self.cur:self.cur.close()if self.conn_s:self.conn_s.close()self.conn.close()def control(self, use_db, que):"""数据库执行部分:param  link:数据库连接que:语句"""if use_db is None:raise CustomError('没有数据库连接')else:self.cur = use_db.cursor()self.cur.execute(que)class CustomError:""" 一个自定义的错误类,作用是直接输出自定义的错误提示 """def __init__(self, arg):self.arg = arg


为了方便, 我写了个类, 把访问数据库的代码又包装了一下
(主要是为了让他根据环境(本地?还是云数据库), 来连接对应的数据库(测试库?还是云数据库))

(本来有try有自定义错误提示的, 后来去掉了, 所以如果需要的话可以加上也行)


以上!

阅读全文
0 0
原创粉丝点击