将变量从Python插入PostgreSQL语句中



postgresql表包含客户名称和ID。我将ID从桌子上拉出,并为每个客户运行单个API调用。该部分有效。

我很难将我从一个表中拉出的变量以及将它们插入下一个表格,以及来自API调用的数据。

最终,我从Meraki的云中删除了一个活跃客户的列表,并为每个范围验证管理员帐户。问题是,当我用管理员填充PostgreSQL表时,我不知道哪个行是哪个客户。我正在尝试从初始API调用中滑入客户名称和ID作为参考。

我尝试了几种不同的语法方法,没有运气。请参阅下面的代码段中注释的部分。insert_query变量是我尝试过的所有方法。

    for row in records:
        customerid = row[0]
        customername = row[1]
        merakiurl = ("https://api.meraki.com/api/v0/organizations/" + customerid + "/admins")
        headers = {
        'X-Cisco-Meraki-API-Key': apiMerakiKey
        }
        response = requests.request("GET", merakiurl, headers=headers)
        dictresponse=json.loads(response.text)
        fields = [
        'name', #Name
        'email', #E-mail
        'id',
        'networks',
        'tags',
        'twoFactorAuthEnabled',
        'lastActive',
        'accountStatus',
        'hasApiKey',
        'orgAccess'
        ]
        for item in dictresponse:
            my_data = [item[field] for field in fields]
            #insert_query = "INSERT INTO tbl_adminlist VALUES (" + customerid + ", " + customername + ", %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
            #insert_query = "INSERT INTO tbl_adminlist VALUES ({customerid}, {customername}, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
            insert_query = "INSERT INTO tbl_adminlist VALUES (" + {customerid} + "," + {customername} + ", %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
            cursor.execute(insert_query, tuple(my_data))
            connection.commit()
        time.sleep(1)

请注意,在摘要开始时定义了客户ID和自定义名称。

之后,在API调用中使用customerID。

然后查看dictresponse下的insert_query变量。我正在尝试添加以前定义的两个变量,并将实际的API响应添加到PostgreSQL中。

这是使用第三个Insert_query完全按照指示运行摘要时的错误。

Error while fetching data from PostgreSQL must be str, not set"

再次,无需尝试使用customerId或自定义名称,此功能正常。

初始文章后编辑

可能可行的另一个选项是将两个变量添加到字典本身中,然后将PostgreSQL语句保持原样。请参阅下面的代码段。

    for row in records:
        customerid = row[0]
        customername = row[1]
        merakiurl = ("https://api.meraki.com/api/v0/organizations/" + customerid + "/admins")
        headers = {
        'X-Cisco-Meraki-API-Key': apiMerakiKey
        }
        response = requests.request("GET", merakiurl, headers=headers)
        dictresponse=json.loads(response.text)
        fields = [
        'customerid',
        'customername',
        'name', #Name
        'email', #E-mail
        'id',
        'networks',
        'tags',
        'twoFactorAuthEnabled',
        'lastActive',
        'accountStatus',
        'hasApiKey',
        'orgAccess'
        ]
        print(fields) #This is for testing only.  Remove once script works.
        for item in dictresponse:
            my_data = [item[field] for field in fields]
            insert_query = "INSERT INTO tbl_adminlist VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
            cursor.execute(insert_query, tuple(my_data))
            connection.commit()
        time.sleep(1)

问题是客户ID,并且API中不存在自定义名称,因此这不起作用。我猜有一种方法可以在my_data =部分添加一些东西来覆盖它?

另一个编辑

澄清下面的输出是运行脚本时返回的数据。注意555555和XYZ公司。这是第[0]中的数据和行[1]。

['555555', 'Company XYZ', 'name', 'email', 'id', 'networks', 'tags', 'twoFactorAuthEnabled', 'lastActive', 'accountStatus', 'hasApiKey', 'orgAccess']

注意列。从第0和第1行中提取的数据应在客户ID和自定义列中填充。从API调用中提取的数据应填充其余的。555555被插入API调用。我想告诉PostgreSQL以下数据所用的ID和客户名称。否则,我正在查看大量帐户信息列表,但不知道与谁关联。

meraki_automation=# select * from tbl_adminlist ;
 customerid | customername | name | email | id | networks | tags | twofactorauthenabled | lastactive | accountstatus | hasapikey | orgaccess 
------------+--------------+------+-------+----+----------+------+----------------------+------------+---------------+-----------+-----------
(0 rows)

脚本运行时,我会收到以下错误:

Error while fetching data from PostgreSQL '555555'

这是因为该标签没有列。我正在尝试将555555输入到CustomerId列中。

您是否想要文字字符串customerid,还是想要代表客户ID的数字(例如5或6或19832(?如果是这样,您需要将变量用作变量,而不仅仅是将变量的名称放入引号中。尝试:

fields = [
        row[0],
        row[1],
        'name', #Name
        'email', #E-mail
        'id',...

或类似的东西?
由于没有错误消息,因此很难解决这个问题,我不知道dictresponse是什么,一旦您打印出来,查询是什么样(您可以向我们展示吗?(

作为一方,您不需要json.loads(,应该有一个response.json()方法,但与您遇到的更大的问题相比,这是一个微不足道的。

保持&感谢您的耐心配合!

最新更新