尝试使用python查询两个mysql数据库,并将结果写入google sheets(每天自动更新)
我的数据分为两个结构相同的mysql数据库 我正在尝试编写一个python脚本,从两个数据库中提取并附加数据,将其存储在变量或文本文件(比如somefile.csv)中,然后另一个脚本从变量/文本文件中获取数据,并通过google sheets api将其导入google sheets。需要注意的是,我的数据每天都在变化,我还希望两个脚本都能自动更新(每天运行并获取更新的数据,第一个脚本重写csv,第二个脚本使用csv中的新数据更新google工作表) 可能吗 到目前为止,我得到的是: 第一个脚本:尝试使用python查询两个mysql数据库,并将结果写入google sheets(每天自动更新),python,mysql,google-sheets,google-sheets-api,Python,Mysql,Google Sheets,Google Sheets Api,我的数据分为两个结构相同的mysql数据库 我正在尝试编写一个python脚本,从两个数据库中提取并附加数据,将其存储在变量或文本文件(比如somefile.csv)中,然后另一个脚本从变量/文本文件中获取数据,并通过google sheets api将其导入google sheets。需要注意的是,我的数据每天都在变化,我还希望两个脚本都能自动更新(每天运行并获取更新的数据,第一个脚本重写csv,第二个脚本使用csv中的新数据更新google工作表) 可能吗 到目前为止,我得到的是: 第一个脚
from mysql.connector import connect, Error
username = "user"
password = "pass"
connection_1 = connect(
host="hostaddress",
user=username,
password=password,
database="databasename"
)
connection_2 = connect(
host="hostaddress",
user=username,
password=password,
database="databasename"
)
cursor_1 = connection_1.cursor()
cursor_2 = connection_2.cursor()
q1 = open('query_db1.sql', 'r')
query1 = q1.read()
q1.close()
q2 = open('query_db2.sql', 'r')
query2 = q2.read()
q2.close()
try:
with connection_1:
with cursor_1:
cursor_1.execute(query_1)
for row in cursor_1.fetchall():
print(row)
with connection_2:
with cursor_2:
cursor_2.execute(query2)
for row in cursor_2.fetchall():
print(row)
except Error as e:
print(e)
我在本脚本中面临的两个问题是:
from googleapiclient.discovery import build
from google.oauth2 import service_account
SERVICE_ACCOUNT_FILE = 'googleapicredentials.json'
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
creds = None
creds = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
SAMPLE_SPREADSHEET_ID = 'SHEET_ID'
service = build('sheets', 'v4', credentials=creds)
request = sheet.values().update(spreadsheetId=SAMPLE_SPREADSHEET_ID,
range="Sheet1!A1", valueInputOption="USER_ENTERED", body={"values":"somefile.csv"}).execute()
同样,我不知道如何让脚本每天更新。我每天在多个项目上都这样做,尽管我使用基于javascript的google应用程序脚本 您可以设置触发器(如chron作业),以便按照您选择的时间表运行函数。触发器在脚本编辑器中设置。寻找沙漏图标。或者,您可以根据脚本中的代码设置触发器
/**
* Creates time-driven triggers
*
* https://developers.google.com/apps-script/reference/script/clock-trigger-builder
*/
function createTimeDrivenTriggers() {
// Trigger every day at 04:00AM CT.
ScriptApp.newTrigger('csvDaily')
.timeBased()
.everyDays(1)
.atHour(4)
.create();
}
下面是一段代码片段,显示了访问MySQL数据库的应用程序脚本代码,我删除了用户名和密码:
const MAXROWS = 10000;
const HOST = '65.60.34.202';
const PORT = '3306';
const USERNAME = '';
const PASSWORD = '';
const DATABASE = 'agustafa_barnes';
const DB_TYPE = 'mysql';
function getL2s() {
var L2s = [];
try {
var fullConnectionString = 'jdbc:' + DB_TYPE + '://' + HOST + ':' + PORT;
var conn = Jdbc.getConnection(fullConnectionString, USERNAME, PASSWORD);
var stmt = conn.createStatement();
stmt.execute('USE ' + DATABASE);
var query = "SELECT * FROM L2s WHERE !IsDeleted ORDER BY TeamTL";
var rs = stmt.executeQuery(query);
while (rs.next()) {
L2s.push([rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5)]);
}
rs.close();
stmt.close();
} catch (e) {
console.log(e, e.lineNumber);
}
return L2s;
}
因此,如果访问数据库是不可能的(我和我的公司有同样的问题),也许您可以设置一些数据提取例程。我们公司有上百个,需要基本授权。我发出一个web请求,然后我可以将数据写入GoogleSheets或我自己的MySQL数据库。下面是我们使用的URL示例:
https://app.yourdomain.com/datadumper/report.ashx?reportid=5107&startDate=2021-04-08&endDate=2021-04-08&bu=3¤tuser=john.agusta&__action=Export#
然后,您可以按如下方式编写应用程序脚本:
/*
https://modjeska.us/csv-google-sheets-basic-auth/
https://redfin.engineering/when-importdata-isnt-good-enough-retrieving-csv-files-behind-basic-auth-with-a-google-apps-script-6c563f3328c5
cm9iZXJ0Om9sZHRpcmVz -- this is a base 64-encoded string of the form
<username>:<password>. In this case, the value represents the username 'robert' and the password 'oldtires', so the string prior to encoding is: robert:oldtires
this site can be used to create a base 64-encoded string:
https://www.base64encode.net/
*/
const auth = '';
VAR URL = "https://app.yourdomain.com/datadumper/report.ashx?reportid=5107&startDate=2021-04-08&endDate=2021-04-08&bu=3¤tuser=john.agusta&__action=Export#";
var csvContents = getCSVContents(URL);
var parsedContents = parseCsvResponse(csvContents, true);
function getCSVContents(csvUrl) {
// request the CSV
var resp = UrlFetchApp.fetch(csvUrl, {
headers: {
// use basic auth
'Authorization': 'Basic ' + auth
}
});
return resp.getContentText();
}
// parse the CSV response
function parseCsvResponse(csvString, ignoreHeaders) {
var retArray = [];
var numCols = 0;
var i = 0;
var j = 0;
var line = "";
var strLines = csvString.split(/\n/g);
if (ignoreHeaders) {
strLines.shift();
}
var lenLines = strLines.length;
for (i = 0; i < lenLines; i++) {
line = strLines[i];
if (line != '') {
retArray.push(line.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/));
numCols = retArray[i].length;
// remove outer double quotes
for (j = 0; j < numCols; j++) {
retArray[i][j] = retArray[i][j].replace(/^"|"$/g, '');
}
}
}
return retArray;
}
/*
https://modjeska.us/csv-google-sheets-basic-auth/
https://redfin.engineering/when-importdata-isnt-good-enough-retrieving-csv-files-behind-basic-auth-with-a-google-apps-script-6c563f3328c5
cm9iZXJ0Om9sZHRpcmVz——这是一个base64编码的字符串
:。在本例中,该值表示用户名“robert”和密码“OldTyres”,因此编码前的字符串为:robert:OldTyres
此网站可用于创建base 64编码字符串:
https://www.base64encode.net/
*/
const auth='';
变量URL=”https://app.yourdomain.com/datadumper/report.ashx?reportid=5107&startDate=2021-04-08&endDate=2021-04-08&bu=3¤tuser=john.agusta&uuuu action=Export#;
var csvContents=getCSVContents(URL);
var parsedContents=parseCsvResponse(csvContents,true);
函数getCSVContents(csvUrl){
//请求CSV
var resp=UrlFetchApp.fetch(csvUrl{
标题:{
//使用基本身份验证
“授权”:“基本”+授权
}
});
返回相应的getContentText();
}
//解析CSV响应
函数parseCsvResponse(csvString、ignoreHeaders){
var-retArray=[];
var numCols=0;
var i=0;
var j=0;
var line=“”;
var strLines=csvString.split(/\n/g);
如果(忽略标题){
strLines.shift();
}
var lenLines=strLines.length;
对于(i=0;i
我每天都在多个项目上这样做,尽管我使用的是基于javascript的google应用程序脚本
您可以设置触发器(如chron作业),以便按照您选择的计划运行函数。触发器在脚本编辑器中设置。查找沙漏图标。您也可以根据脚本中的代码设置触发器
/**
* Creates time-driven triggers
*
* https://developers.google.com/apps-script/reference/script/clock-trigger-builder
*/
function createTimeDrivenTriggers() {
// Trigger every day at 04:00AM CT.
ScriptApp.newTrigger('csvDaily')
.timeBased()
.everyDays(1)
.atHour(4)
.create();
}
下面是一段代码片段,显示了访问MySQL数据库的应用程序脚本代码,我删除了用户名和密码:
const MAXROWS = 10000;
const HOST = '65.60.34.202';
const PORT = '3306';
const USERNAME = '';
const PASSWORD = '';
const DATABASE = 'agustafa_barnes';
const DB_TYPE = 'mysql';
function getL2s() {
var L2s = [];
try {
var fullConnectionString = 'jdbc:' + DB_TYPE + '://' + HOST + ':' + PORT;
var conn = Jdbc.getConnection(fullConnectionString, USERNAME, PASSWORD);
var stmt = conn.createStatement();
stmt.execute('USE ' + DATABASE);
var query = "SELECT * FROM L2s WHERE !IsDeleted ORDER BY TeamTL";
var rs = stmt.executeQuery(query);
while (rs.next()) {
L2s.push([rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5)]);
}
rs.close();
stmt.close();
} catch (e) {
console.log(e, e.lineNumber);
}
return L2s;
}
因此,如果访问数据库是不可能的(我和我的公司有同样的问题),也许你可以设置一些数据提取例程。我们公司有数百个,需要基本授权。我发出web请求,然后我可以将数据写入google sheets或我自己的MySQL数据库。下面是我们使用的示例URL:
https://app.yourdomain.com/datadumper/report.ashx?reportid=5107&startDate=2021-04-08&endDate=2021-04-08&bu=3¤tuser=john.agusta&__action=Export#
然后,您可以按如下方式编写应用程序脚本:
/*
https://modjeska.us/csv-google-sheets-basic-auth/
https://redfin.engineering/when-importdata-isnt-good-enough-retrieving-csv-files-behind-basic-auth-with-a-google-apps-script-6c563f3328c5
cm9iZXJ0Om9sZHRpcmVz -- this is a base 64-encoded string of the form
<username>:<password>. In this case, the value represents the username 'robert' and the password 'oldtires', so the string prior to encoding is: robert:oldtires
this site can be used to create a base 64-encoded string:
https://www.base64encode.net/
*/
const auth = '';
VAR URL = "https://app.yourdomain.com/datadumper/report.ashx?reportid=5107&startDate=2021-04-08&endDate=2021-04-08&bu=3¤tuser=john.agusta&__action=Export#";
var csvContents = getCSVContents(URL);
var parsedContents = parseCsvResponse(csvContents, true);
function getCSVContents(csvUrl) {
// request the CSV
var resp = UrlFetchApp.fetch(csvUrl, {
headers: {
// use basic auth
'Authorization': 'Basic ' + auth
}
});
return resp.getContentText();
}
// parse the CSV response
function parseCsvResponse(csvString, ignoreHeaders) {
var retArray = [];
var numCols = 0;
var i = 0;
var j = 0;
var line = "";
var strLines = csvString.split(/\n/g);
if (ignoreHeaders) {
strLines.shift();
}
var lenLines = strLines.length;
for (i = 0; i < lenLines; i++) {
line = strLines[i];
if (line != '') {
retArray.push(line.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/));
numCols = retArray[i].length;
// remove outer double quotes
for (j = 0; j < numCols; j++) {
retArray[i][j] = retArray[i][j].replace(/^"|"$/g, '');
}
}
}
return retArray;
}
/*
https://modjeska.us/csv-google-sheets-basic-auth/
https://redfin.engineering/when-importdata-isnt-good-enough-retrieving-csv-files-behind-basic-auth-with-a-google-apps-script-6c563f3328c5
cm9iZXJ0Om9sZHRpcmVz——这是一个base64编码的字符串
:。在本例中,该值表示用户名“robert”和密码“OldTyres”,因此编码前的字符串为:robert:OldTyres
此网站可用于创建base 64编码字符串:
https://www.base64encode.net/
*/
const auth='';
变量URL=”https://app.yourdomain.com/datadumper/report.ashx?reportid=5107&startDate=2021-04-08&endDate=2021-04-08&bu=3¤tuser=john.agusta&uuuu action=Export#;
var csvContents=getCSVContents(URL);
var parsedContents=parseCsvResponse(csvContents,true);
函数getCSVContents(csvUrl){
//请求CSV
var resp=UrlFetchApp.fetch(csvUrl{
标题:{
//使用基本身份验证
“授权”:“基本”+授权
}
});
返回相应的getContentText();
}
//解析CSV响应
函数parseCsvResponse(csvString、ignoreHeaders){
var-retArray=[];
var numCols=0;
var i=0;
var j=0;
var line=“”;
var strLines=csvString.split(/\n/g);
如果(忽略标题){
strLines.shift();
}
var lenLines=strLines.length;
对于(i=0;i