Разобрался с некоторыми подсказками @basarat. Должен быть явный возврат для первого результата, а не цикл for: return querySnapshot.docs[0].id;
. Полная измененная функция ниже:
async function addParticipant(email_address: string) {
try {
console.log("Querying for person");
const query = await db.collection('people')
.where('emails', 'array-contains', email_address)
.limit(1);
const querySnapshot = await query.get();
if (!querySnapshot.empty) {
console.log("Document exists for email " + email_address);
return querySnapshot.docs[0].id;
} else {
console.log("Creating person with " + email_address);
const fields = {emails: [email_address]};
try {
const docRef = await db.collection('people').add(fields);
console.log("New document id: " + docRef.id);
const document_id = docRef.id;
return document_id;
} catch (err) {
console.log("Error adding document:", err);
}
}
} catch (err) {
console.log("Error getting document:", err);
}
};
Это немного сыро - но для одного от заданий, я иногда использую Excel.
при импорте файла CSV в Excel можно создать формулу, которая создает оператор INSERT при помощи конкатенации строк в формуле. Таким образом - если Ваш файл CSV имеет 3 столбца, которые появляются в столбцах A, B, и C в Excel, Вы могли записать формулу как...
="INSERT INTO MyTable (Col1, Col2, Col3) VALUES (" & A1 & ", " & B1 & ", " & C1 & ")"
Тогда можно копировать формулу вниз все строки и копия, и вставить ответ в текстовый файл для выполнения против базы данных.
Как я говорю - это сыро - но это может быть вполне 'быстрый и грязный' способ получить сделанное задание!
Ну, если это - CSV, и это это - один процесс времени, откройте файл в Excel, и затем запишите формулы для заполнения данных всегда, Вы требуете, и затем пишете простую формулу Concat, чтобы создать Ваш SQL, и затем скопировать ту формулу для каждой строки. Вы получите большое количество SQL-операторов, которые можно выполнить где угодно, Вы хотите.
Fabio,
я сделал то, что Vaibhav много раз делал, и это - хороший "быстрый и грязный" способ получить данные в базу данных.
, Если необходимо сделать это несколько раз, или на некотором типе расписания, тогда более надежный путь состоит в том, чтобы загрузить данные CSV "как есть" в рабочую таблицу (т.е. customer_dataload) и затем использовать стандартные SQL-операторы для заполнения недостающих полей.
(я не знаю синтаксис Firebird - но что-то как...)
UPDATE person
SET id = (SELECT newguid() FROM createguid)
UPDATE person
SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)
и т.д.
Обычно, это намного быстрее (и более надежно) получить данные В базу данных и затем зафиксировать данные, чем попытаться зафиксировать данные во время загрузки. Вы также извлекаете пользу из транзакций, чтобы позволить Вам ОТКАТЫВАТЬ, если она не работает!!
Вы могли импортировать файл CSV в таблицу, как, затем запишите SQL-запрос, который делает все необходимые преобразования на импортированной таблице и вставляет результат в целевую таблицу.
Так что-то как:
< (загрузите файл CSV в temp_table - n, city_name),>
вставляют в t.n выбора target_table
, c.city_id как город
от temp_table t, города c
, где t.city_name = c.city_name
Хорошая подсказка об использовании Excel, но я также предлагаю стать довольным языком сценариев как Python, потому что для некоторой задачи легче просто записать быстрый сценарий Python, чтобы сделать задание, чем попытка найти функцию, в которой Вы нуждаетесь в Excel или предварительно сделанном инструменте, который делает задание.
Я сделал бы это с awk.
, Например, если у Вас была эта информация в файле CSV:
Bob,New York
Jane,San Francisco
Steven,Boston
Marie,Los Angeles
следующая команда даст Вам, что Вы хотите, выполняете в том же каталоге как Ваш файл CSV (названный name-city.csv
в этом примере).
$ awk -F, '{ print "INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES ((SELECT NEW_GUID FROM CREATE_GUID), '\''"$1"'\'', (SELECT CITY_ID FROM CITY WHERE NAME = '\''"$2"'\''))" }' name-city.csv
Тип awk --help
для получения дополнительной информации.
Инструмент, который я недавно пробовал, который работал нестандартно, является FSQL .
Вы пишете команду импорта, вставьте ее в FSQL
, и он импортирует файл CSV в таблицу Firebird.
Только что закончил этот скрипт VBA, который может быть полезен для этой цели. Все, что нужно сделать, это изменить оператор Insert, чтобы включить соответствующую таблицу и список столбцов (очевидно, в той же последовательности, в которой они появляются в файле Excel).
Function CreateInsertStatement()
'Output file location and start of the insert statement
SQLScript = "C:\Inserts.sql"
cStart = "Insert Into Holidays (HOLIDAY_ID, NAT_HOLDAY_DESC, NAT_HOLDAY_DTE) Values ("
'Open file for output
Open SQLScript For Output As #1
Dim LoopThruRows As Boolean
Dim LoopThruCols As Boolean
nCommit = 1 'Commit Count
nCommitCount = 100 'The number of rows after which a commit is performed
LoopThruRows = True
nRow = 1 'Current row
While LoopThruRows
nRow = nRow + 1 'Start at second row - presuming there are headers
nCol = 1 'Reset the columns
If Cells(nRow, nCol).Value = Empty Then
Print #1, "Commit;"
LoopThruRows = False
Else
If nCommit = nCommitCount Then
Print #1, "Commit;"
nCommit = 1
Else
nCommit = nCommit + 1
End If
cLine = cStart
LoopThruCols = True
While LoopThruCols
If Cells(nRow, nCol).Value = Empty Then
cLine = cLine & ");" 'Close the SQL statement
Print #1, cLine 'Write the line
LoopThruCols = False 'Exit the cols loop
Else
If nCol > 1 Then 'add a preceeding comma for all bar the first column
cLine = cLine & ", "
End If
If Right(Left(Cells(nRow, nCol).Value, 3), 1) = "/" Then 'Format for dates
cLine = cLine & "TO_DATE('" & Cells(nRow, nCol).Value & "', 'dd/mm/yyyy')"
ElseIf IsNumeric(Left(Cells(nRow, nCol).Value, 1)) Then 'Format for numbers
cLine = cLine & Cells(nRow, nCol).Value
Else 'Format for text, including apostrophes
cLine = cLine & "'" & Replace(Cells(nRow, nCol).Value, "'", "''") & "'"
End If
nCol = nCol + 1
End If
Wend
End If
Wend
Close #1
End Function