尝试使用python查询两个mysql数据库,并将结果写入google sheets(每天自动更新)

尝试使用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工作表) 可能吗 到目前为止,我得到的是: 第一个脚

我的数据分为两个结构相同的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&currentuser=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&currentuser=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&currentuser=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&currentuser=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