批量更新GUID,却啥也没写入数据库表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批量更新GUID,却啥也没写入数据库表相关的知识,希望对你有一定的参考价值。

1.我用这插入表的GU_ID列,却什么也写入。
DECLARE
BEGIN
FOR JH_ IN (SELECT ZSJXX.JH FROM ZSJXX) LOOP
UPDATE ZSJXX SET ZSJXX.GU_ID=aildm_get_guid WHERE ZSJXX.JH='JH_';
END LOOP;
END;
/*aildm_get_guid 为获取oracle的GUID的一个函数*/

2.单独拿出一条来写入成功
UPDATE ZSJXX SET ZSJXX.GU_ID=aildm_get_guid WHERE ZSJXX.JH='某列记录';
3.这样批量写入,结果只写入了“某列记录”的那条,其他还是空白没有写入。
DECLARE
BEGIN
FOR JH_ IN (SELECT ZSJXX.JH FROM ZSJXX) LOOP
UPDATE ZSJXX SET ZSJXX.GU_ID=aildm_get_guid WHERE ZSJXX.JH='JH_';
UPDATE ZSJXX SET ZSJXX.GU_ID=aildm_get_guid WHERE ZSJXX.JH='某列记录';
END LOOP;
求指教!!!

参考技术A 'JH_',是字符串常量,我觉得你是要变量,把引号去了再加结果列表
JH_.JH ;游标.列名

我感觉你这UPDATE不加条件一条语句就全更新了。
UPDATE ZSJXX SET GU_ID=SYS_GUID();追问

这批量更新是为了给一张表里每条记录增加一个GUID,‘JH_’是一个隐式游标的一个变量,是类似表每一条记录id的一个指针变量。

追答

游标的一个变量是不能放在引号里的,放里面就不对了

使用 gspread 写入 Google 工作表时无法实现批量更新行

【中文标题】使用 gspread 写入 Google 工作表时无法实现批量更新行【英文标题】:Trouble implementing batch update rows while writing to a google sheet using gspread 【发布时间】:2022-01-18 04:19:09 【问题描述】:

我正在尝试在使用 gspread 库将数据写入谷歌电子表格时批量更新行。当以下函数get_content() 产生一个结果时,我可以完美地执行batch update rows

import gspread
import requests
from oauth2client.service_account import ServiceAccountCredentials

link = 'https://api.coinmarketcap.com/data-api/v3/cryptocurrency/listing'
params = 
    'start': 1,
    'limit': '200',
    'sortBy': 'market_cap',
    'sortType': 'desc',
    'convert': 'USD,BTC,ETH',
    'cryptoType': 'all',
    'tagType': 'all',
    'audited': 'false',
    'aux': 'ath,atl,high24h,low24h,num_market_pairs,cmc_rank,date_added,max_supply,circulating_supply,total_supply,volume_7d,volume_30d,self_reported_circulating_supply,self_reported_market_cap'


def authenticate():
    scope = [
        "https://spreadsheets.google.com/feeds",
        "https://www.googleapis.com/auth/spreadsheets",
        "https://www.googleapis.com/auth/drive.file",
        "https://www.googleapis.com/auth/drive"
    ]

    creds = ServiceAccountCredentials.from_json_keyfile_name("creds.json", scope)
    client = gspread.authorize(creds)
    return client

def get_content(s,link,params):
    res = s.get(link,params=params)
    for item in res.json()['data']['cryptoCurrencyList']:
        yield item['id']

if __name__ == '__main__':
    with requests.Session() as s:
        s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
        client = authenticate()
        sheet = client.open("testFile").sheet1
        sheet.insert_row(['NAME'],1)
        item_list = []
        cell_list = sheet.range('A2:A201')
        for item in get_content(s,link,params):
            item_list.append(item)

        for i, val in enumerate(item_list):
            cell_list[i].value = val
        sheet.update_cells(cell_list)

但是,当同一个函数get_content() 产生多个结果时,我找不到任何方法来执行batch update rows。这次的范围是sheet.range('A2:D201')

def get_content(s,link,params):
    res = s.get(link,params=params)
    for item in res.json()['data']['cryptoCurrencyList']:
        yield item['id'],item['name'],item['symbol'],item['slug']

如何在使用 gspread 写入谷歌表格时批量更新行?

【问题讨论】:

【参考方案1】:

你的情况,下面的修改怎么样?

发件人:

item_list = []
cell_list = sheet.range('A2:A201')
for item in get_content(s,link,params):
    item_list.append(item)

for i, val in enumerate(item_list):
    cell_list[i].value = val
sheet.update_cells(cell_list)

收件人:

item_list = []
for item in get_content(s,link,params):
    item_list.append(item)

sheet.update('A2:D201', item_list, value_input_option='USER_ENTERED')

参考:

update

【讨论】:

它做得非常好。但是,要使其正常工作,我必须先升级 gspread 库。感谢一万亿@Tanaike。 @MITHU 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。

以上是关于批量更新GUID,却啥也没写入数据库表的主要内容,如果未能解决你的问题,请参考以下文章

mybatis batch insert

plsql导入dmp表,一闪而过,显示done,但是却啥也没有导进去

ElasticSearch实战(十八)-批量写入与更新

ElasticSearch实战(十八)-DSL批量写入与更新

PLSQL中批量更新数据

msql 批量更新