@Tyusha

Есть способ с помощью Mysqli одним махом засунуть JSON в базу?

Извините за нубский вопрос, но я не программистка.

Получаю от клиента JSON, где ключи в точности совпадают с названиями полей таблицы. Если ли волшебная таблетка, чтобы одним махом сделать INSERT или UPDATE в базу?

Я понимаю, что можно расписать все поля в prepare(), потом забиндить данные каждого поля — это я всё могу... Но может быть есть в mysqli способ, чтобы вжух, и готово!
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Что-то вроде этого?
function mysqli_json_insert($mysqli, $tablename, $json){
  $arr =  json_decode($json, true);
  $fields = '`' . implode('`, `', array_keys($arr)) . '`' ;
  $values = implode(',', array_fill(0, count($arr)));
  $stmt = $mysqli->prepare("insert into `$tablename` ($fields) values ($values)");
  $types = str_repeat('s', count($arr));
  $stmt->bind_param($types, ...$arr);
  $stmt->execute();
}
Писал с руки, так что могут быть очепятки...
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Adamos
@Adamos
Если использовать не голый Mysqli, а обертку для него вроде phpfaq.ru/safemysql - задача таки решается в одну строчку:
$db->query('INSERT INTO `table` SET ?u', json_decode($json, true));
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Варианты. Можно преобразовать JSON в JSON-Lines (где каждая строчка - это независимый JSON документ представляющий строку таблицы).

Потом загрузить это в spark dataframe
Using Scala version 2.12.15 (OpenJDK 64-Bit Server VM, Java 11.0.17)
Type in expressions to have them evaluated.
Type :help for more information.

scala> val df1 = spark.read.json("/tmp/emp.json")
df1: org.apache.spark.sql.DataFrame = [_corrupt_record: string]

И имея фрейм либо сохранить в CSV либо подключить драйвер JDBC записать прямо в базу.

Еще во фреймворке Pandas есть опции загрузки из JSON. Но я сам не спец в пандасе поэтому
точно как сделать не скажу.

Вот. Еще я помню где-то писал утилиту чтоб произвольные JSON конвертить в JSON-lines.

Короче способов - масса. Беда как обычно в вопрошающем. Что он готов для этого установить
и что выучить.
Ответ написан
Комментировать
@PigData
Предложу варианты отличающиеся от озвученных, возможно это сложнее и скорее для общего развития:

1. Просто хранить Json построчно в поле с типом json

2. Если надо раскидывать json по полям, можно создать поля таблицы которые будут автоматически записываться из поля json, примерно так

`firstname`  VARCHAR(255) GENERATED ALWAYS AS (`json` ->> '$.firstname') STORED NULL,


3. Можно просто сконвертить JSON в CSV (5-6 строчек кода) и вставить стандартными средствами. На больших файлах при вставке через консоль может получиться и выигрыш во времени.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы