给自己搭一个金融数据库(六)——通过API远程访问mysql

举报
darkpard 发表于 2022/05/04 11:20:20 2022/05/04
【摘要】 给自己搭一个金融数据库(四)——数据库的远程访问介绍了通过数据库账号远程访问数据库的方法,同时考虑到服务器的安全性,我们把可远程访问的账号设置了IP限定,即只有特定的IP地址才能连接到数据库。今天我们介绍另一种远程访问数据库的方法,通过在服务器上启动一个API服务的方式实现mysql的远程访问。1. python的API服务python可以选用的API服务框架有好几种,这里我们选择torna...

给自己搭一个金融数据库(四)——数据库的远程访问介绍了通过数据库账号远程访问数据库的方法,同时考虑到服务器的安全性,我们把可远程访问的账号设置了IP限定,即只有特定的IP地址才能连接到数据库。

今天我们介绍另一种远程访问数据库的方法,通过在服务器上启动一个API服务的方式实现mysql的远程访问。

1. python的API服务

python可以选用的API服务框架有好几种,这里我们选择tornado。

1.1. 安装tornado

tornado的安装非常简单

pip install tornado

1.2. 启动API服务

先导入需要的包

import tornado.ioloop
from tornado.web import Application, RequestHandler
from concurrent.futures import ThreadPoolExecutor
from tornado.gen import coroutine
from tornado.concurrent import run_on_executor

然后新建一个类继承RequestHandler

class class1(RequestHandler):
    @coroutine
    def post(self):
        data = json.loads(self.request.body)
        data = func(data)
        self.write(data.to_json())

其中func为数据库操作函数,返回值data为DataFrame类型。注意,DataFrame转json需要用to_json函数,而不是json.dumps。

再后创建一个tornado.web.Application的实例

app = Application([
    (r'/name1', class1), 
])

其中class1为刚刚创建的类的名称。

最后启动API服务

if __name__ == '__main__':
    app.listen(port)
    tornado.ioloop.IOLoop.instance().start()

其中port为服务器上的端口。注意,如果服务器上创建了安全实例,需要去服务器上开通端口。

1.3. 调用API服务

调用API服务也非常简单。

先导入需要的包

import requests

然后调用我们刚刚启动的API服务

data = requests.post(url, json=json)

这里的url=服务器IP:port/name1。port和name1见上一节。

最后将得到的数据转为DataFrame形式

pd.DataFrame.from_dict(data.json(), orient='columns')

2. 远程数据库操作

数据库操作可以很多不同的操作方式,比如我们在用python来自动生成word版投资报告中提到的DataFrame读取mysql的方式pd.read_sql()。

此时,服务器端的func(见1.2节)可以写成

def func(sql):
    return pd.read_sql(sql, engine)

其中sql为查询语句;engine为数据库引擎,可见给自己搭一个金融数据库(三)的3.1.3.节。

3. 需要注意的问题

这里还有两个需要注意的问题。

3.1. 问题一

数据库查询返回的日期型经过json的置换后会变成时间戳型(np.int64),需要将其转换回日期型,或者日期形式的string型,比如

datetime.datetime.fromtimestamp(return_date/1000, pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S')

3.2. 问题二

如果不是数据库查询,而是数据插入,那么返回值为None,1.2.节中的data.to_json()将为报错,可以考虑将data赋值为空DataFrame

data = pd.DataFrame()

参考文献:

  1. https://blog.csdn.net/weixin_36459547/article/details/117864314
  2. https://blog.csdn.net/sslfk/article/details/122824057
  3. https://www.cnblogs.com/gaodp/p/15703422.html
  4. https://blog.csdn.net/sinat_23971513/article/details/122609800
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。