Превышено максимальное количество байтов в отчете Ошибка при использовании API do_query в Quickbase

Я использую QBApiWrap.QuickbaseApiWrapper.DoQuery в C#, чтобы получить записи из моей таблицы. Раньше все работало нормально. Теперь количество записей увеличилось до 30000, и я получаю следующую ошибку:

Errcode: 75

Errtext: слишком большой отчет

Errdetails: Превышено максимальное количество байтов в отчете

Как я могу получить все записи в одном наборе данных?

Я запрашиваю ниже:

     DataSet dsEmployee = My_Integration.QBApiWrap.QuickbaseApiWrapper.DoQuery(dbIdEmployee, ticket, "","3.6.7.8.21.15");

3 ответа

Решение

Quickbase имеет ограничение на размер одного ответа, который превышает ваш запрос. Чтобы избежать этой ошибки, вам нужно уменьшить количество записей, возвращаемых запросом. Если вы на самом деле не используете все возвращенные записи в своей программе, вы должны структурировать свой запрос так, чтобы исключить записи, которые вы не используете. Если вам действительно нужны все записи в этой таблице, вам нужно будет загрузить их пакетами, а затем объединить наборы данных.

К сожалению, я никогда не программировал C#, поэтому я не могу помочь вам с синтаксисом, но для загрузки записей в пакетах вы можете использовать API_GetSchema в вашей таблице DBID, чтобы получить следующий идентификатор записи (table.original.next_record_id). Этот номер является идентификатором записи для следующей записи, которая будет создана. Итак, вы знаете, что все ваши идентификаторы записей меньше, чем это число. Используя нижнюю границу 0 и верхнюю границу 20000, вы можете запрашивать записи, в которых идентификатор записи больше нижней границы и меньше верхней границы. Объедините результаты с существующим набором данных, увеличьте обе границы на 20000 и повторяйте, пока нижняя граница не превысит номер идентификатора следующей записи. В конце у вас должен быть один набор данных и код, который должен масштабироваться с вашей таблицей Quickbase.

Я только что столкнулся с этой проблемой с отчетом, который имеет только 4 поля, но более 120 тыс. Записей. Вы можете использовать API_DoQueryCount, чтобы получить общее количество записей, которые ваш запрос возвратит в сочетании с параметрами API_DoQuery "num-n (n - количество возвращаемых записей" и "skip-n (n - количество пропускаемых записей"). чтобы разбить свой путь по записям, как этот псевдокод ниже:

maxRecords = {API_DoQueryCount}
retrievedRecords = 0
recordChunk = 1000
myCSV = path\to\csv
tempRecords = ""
while (retrievedRecords < maxRecords)
  tempRecords = API_DoQuery&query="yourQuery"&options=num-{recordChunk}.skip-{retrievedRecords}
  myCSV += tempRecords
  retrievedRecords += 1000

Хотя приведенный выше пример слишком упрощен и пропускает этап преобразования XML в CSV, я думаю, что он дает вам начальное представление о том, как это можно сделать.

Кроме того, наш отчет перестает возвращать записи через некоторое время после того, как он превысил 110000 записей, поэтому кажется, что они, возможно, расширили предел, который они имели до этого. Я также хотел бы поиграть с тем, сколько записей вы возвращаете за раз, и использовать самое большое безопасное число, которое вы можете найти, чтобы уменьшить количество запросов, которые ваше приложение должно сделать, чтобы оно работало быстрее.

К сожалению, Quickbase имеет рекордное ограничение на размер ответа. Один из способов сделать это — выполнить запрос к фрагментам данных.

Вот код в питоне на основе нового QB JSON API

      import pyqb

qbc = pyqb.Client(url='https://yourcompany.quickbase.com', user_token='')
max_records = qbc.getnumrecords(database='DBID')
retrived=0
o=[]

headers = {
        'QB-Realm-Hostname': 'yourcompany.quickbase.com',
        'User-Agent': '{User-Agent}',
        'Authorization': 'token'
    }

while retrived < int(max_records):

    body = { 
      "from": "DBID",
      "select": [ ## select all the fields you want 
         109, 
         15,
         1,
         6,   
      ],
      "options" : {
          "skip":retrived,
          "top": 25000
      }
    }

    r = requests.post(
    'https://api.quickbase.com/v1/records/query', 
    headers = headers, 
    json = body)
    
    data=r.json()
    o.append(pd.json_normalize(data['data'])) # save records 

    retrived += data['metadata']['numRecords']


Другие вопросы по тегам