给自己搭一个金融数据库(六)——通过API远程访问mysql
给自己搭一个金融数据库(四)——数据库的远程访问介绍了通过数据库账号远程访问数据库的方法,同时考虑到服务器的安全性,我们把可远程访问的账号设置了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()
参考文献:
-
https://blog.csdn.net/weixin_36459547/article/details/117864314 -
https://blog.csdn.net/sslfk/article/details/122824057 -
https://www.cnblogs.com/gaodp/p/15703422.html -
https://blog.csdn.net/sinat_23971513/article/details/122609800
- 点赞
- 收藏
- 关注作者
评论(0)