使用Python从Redshift到Google Spreadsheet
读取、写入和格式化电子表格的精简工作流程
最近我试图从亚马逊Redshift数据库中提取数据,并使用Python脚本将其推送到谷歌电子表格中。脚本的目的是从亚马逊Redshift数据库中读取数据,应用一些业务规则,并将其写入谷歌电子表格中。
我已经在我的Python脚本中使用了这个 gspread 库,这只是谷歌数据表的python API。使用它,我们可以非常容易地读、写和格式化电子表格。
要与谷歌API互动,第一步是在谷歌开发控制台创建一个项目,并启用API。
- 创建一个项目(点击这里) 。
2.给予一个项目名称。
3.进入项目仪表板,点击+ENABLE APIS AND SERVICES 。
4.4. 搜索Google Drive API,点击它并启用。做同样的过程来启用谷歌电子表格API。
5.点击创建凭证。
6.选择参数并点击我需要什么证书?
7.输入服务账户名称并选择角色 。
8.现在点击KEYS,创建一个json格式的新密钥。
一个JSON文件将被下载。我们的脚本中需要这个JSON文件。所以把这个文件重命名为 client_secretkey.json.
现在去你的Google Drive,创建一个Google工作表,并将其命名为redshift-to-Google-Sheet。复制 client_email从你上面下载的JSON文件中的值,并将该Google Sheet分享到这个 client_email具有编辑权限。
在这一点上,我们已经设置好了一切,现在让我们来写我们的Python脚本。为了使用Python脚本与电子表格进行交互,我们必须安装gspread Python库。因此,打开终端,运行以下命令。 oauth2client是一个Python库,用于访问受OAuth 2.0保护的资源。
pip install gspread
现在创建一个Python文件,命名为redshift_to_spradsheet**.**py。复制并粘贴以下代码。
import gspread
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/spreadsheets",
credentials = ServiceAccountCredentials.from_json_keyfile_name('client_secretkey.json', scope)
现在让我们添加代码来连接到redshift数据库。我使用了sqlalchemy 库,它可以促进Python程序和数据库之间的通信。
要安装sqlalchemy,请输入以下代码。
pip install sqlalchemy
现在把sqlalchemy导入你的Python脚本,并使用create_engine建立数据库连接。在连接字符串之后,写选择查询(或任何其他DML)来获取数据并将其存储到pandas数据框中。
from sqlalchemy
# Connecting to postgresql
为了将这个数据框架写入谷歌电子表格,我们必须安装df2gspread python库。要安装df2gspread,请输入以下内容。
pip install df2gspread
现在将df2gspread导入你的python脚本,并创建一个名为write_googlesheet的函数,如下所示。
from df2gspread import df2gspread as d2g
def write_googlesheet(df, spreadsheet_key, sheet_title, starting_cell, overwrite):
这个d2g.upload函数将上传给定的Pandas DataFrame到Google Drive并返回gspread工作表对象。在这里,我从电子表格的URL中传递了电子表格的关键字,电子表格的标题是电子表格的名称(如:Sheet1, Sheet2)。想了解更多关于该函数参数的知识,请点击这里。
github链接:redshift_spreadsheet.py
现在运行Python脚本,并在浏览器中打开**redshift-to-Google-**Sheet Google Sheet。你会看到你的Google Sheet已经更新了内容。
总结
这篇文章的目的是让人们了解这种类型的实现。可以有很多不同的策略,但我觉得对于天真的开发者来说,它不太复杂,也很容易理解。
From Redshift to Google spread sheet using Python最初发表于Towards Data Scienceon Medium,人们在这里通过强调和回应这个故事来继续对话。