Как экспортировать базу данных MySQL в JSON? - PullRequest
48 голосов
/ 18 февраля 2011

Я заинтересован в экспорте подмножества значений из базы данных MySQL в файл в формате JSON на диске.

Я нашел ссылку, которая говорит о возможном способе сделать это: http://www.thomasfrank.se/mysql_to_json.html

... но когда я использую метод с этой страницы, он работает, но с двумя проблемами:

1) Возвращает только около 15 результатов, последний из которых резко обрезается (не завершен). Мой стандартный запрос на это возвращает около 4000 результатов, когда я просто запускаю его как SELECT name, email FROM students WHERE enrolled IS NULL Но когда я запускаю его как:

SELECT 
     CONCAT("[",
          GROUP_CONCAT(
               CONCAT("{name:'",name,"'"),
               CONCAT(",email:'",email,"'}")
          )
     ,"]") 
AS json FROM students WHERE enrolled IS NULL;

... как описано в ссылке, он возвращает только (как я уже говорил) 15 результатов. (Между прочим, я проверил эти результаты против 4000, которые я должен получить, и эти 15 совпадают с первыми 15 из 4000)

2) Кажется, в настоящий файл включены «escape» символы, когда я добавляю INTO OUTFILE '/path/to/jsonoutput.txt' FIELDS TERMINATED BY ',' в конец этого запроса. Таким образом, запятые в конечном итоге выглядят как '\', когда, очевидно, я просто хотел бы получить запятые без \.

Любые идеи о том, как получить правильный вывод JSON из MySQL? (Либо с помощью этого метода, либо каким-либо другим методом)?

Спасибо!

Ответы [ 13 ]

34 голосов
/ 16 марта 2011

Если у вас есть Ruby, вы можете установить камень mysql2xxxx (не камень mysql2json, который является другим камнем):

$ gem install mysql2xxxx

и затем запустить команду

$ mysql2json --user=root --password=password --database=database_name --execute "select * from mytable" >mytable.json

Камень также дает mysql2csv и mysql2xml.Это не так быстро, как mysqldump, но также не страдает от некоторых странностей mysqldump (например, только возможность выгрузить CSV с того же компьютера, что и сам сервер MySQL)

18 голосов
/ 18 февраля 2011

Возможно, MySQL слишком много просит, чтобы он генерировал правильно сформированный json напрямую из запроса. Вместо этого рассмотрите возможность создания чего-то более удобного, например CSV (используя уже знакомый фрагмент INTO OUTFILE '/path/to/output.csv' FIELDS TERMINATED BY ','), а затем преобразование результатов в json на языке со встроенной поддержкой для него, например, python или php.

Редактировать пример Python с использованием прекрасной SQLAlchemy:

class Student(object):
    '''The model, a plain, ol python class'''
    def __init__(self, name, email, enrolled):
        self.name = name
        self.email = email
        self.enrolled = enrolled

    def __repr__(self):
        return "<Student(%r, %r)>" % (self.name, self.email)

    def make_dict(self):
        return {'name': self.name, 'email': self.email}



import sqlalchemy
metadata = sqlalchemy.MetaData()
students_table = sqlalchemy.Table('students', metadata,
        sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True),
        sqlalchemy.Column('name', sqlalchemy.String(100)),
        sqlalchemy.Column('email', sqlalchemy.String(100)),
        sqlalchemy.Column('enrolled', sqlalchemy.Date)
    )

# connect the database.  substitute the needed values.
engine = sqlalchemy.create_engine('mysql://user:pass@host/database')

# if needed, create the table:
metadata.create_all(engine)

# map the model to the table
import sqlalchemy.orm
sqlalchemy.orm.mapper(Student, students_table)

# now you can issue queries against the database using the mapping:
non_students = engine.query(Student).filter_by(enrolled=None)

# and lets make some json out of it:
import json
non_students_dicts = ( student.make_dict() for student in non_students)
students_json = json.dumps(non_students_dicts)
10 голосов
/ 18 мая 2015

Другая возможность - использование MySQL Workbench.

Существует опция экспорта JSON в контекстном меню браузера объектов и в меню сетки результатов.

Дополнительная информация о Документация MySQL: экспорт и импорт данных .

10 голосов
/ 18 февраля 2011

Это то, что должно быть сделано на прикладном уровне.

Например, в php это просто как

Редактировать Добавлены соединения с БД. Ничего внешнего не нужно.

$sql = "select ...";
$db = new PDO ( "mysql:$dbname", $user, $password) ;
$stmt = $db->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();

file_put_contents("output.txt", json_encode($result));
9 голосов
/ 10 декабря 2015

HeidiSQL позволяет вам сделать это также.

Выделите любые данные на вкладке ДАННЫЕ или в наборе результатов запроса ... затем щелкните правой кнопкой мыши и выберите опцию Экспортировать строки сетки. Затем эта опция позволяет вам экспортировать любые ваши данные в формате JSON, прямо в буфер обмена или непосредственно в файл:

enter image description here

6 голосов
/ 23 июня 2012

Другое решение, если вы используете Ruby, - это написать сценарий подключения к базе данных с ActiveRecord.Сначала вам нужно будет установить его

gem install activerecord

# ruby ./export-mysql.rb
require 'rubygems'
require 'active_record'

ActiveRecord::Base.establish_connection(
  :adapter => "mysql",
  :database => "database_name",
  :username => "root",
  :password => "",
  :host => "localhost"
)

class Event < ActiveRecord::Base; end
class Person < ActiveRecord::Base; end

File.open("events.json", "w") { |f| f.write Event.all.to_json }
File.open("people.json", "w") { |f| f.write Person.all.to_json }

Вы также можете добавить методы к классам ActiveRecord, если вы хотите сначала манипулировать данными или включать или исключать определенные столбцы.*

Person.all.to_json(:only => [ :id, :name ])

С ActiveRecord вы не ограничены JSON.Вы можете так же легко экспортировать как XML или YAML

Person.all.to_xml
Person.all.to_yaml

Вы не ограничены MySQL.Любая база данных, поддерживаемая ActiveRecord (Postgres, SQLite3, Oracle ... и т. Д.).

И стоит упомянуть, что вы можете открыть еще один дескриптор базы данных

require 'active_record'

ActiveRecord::Base.configurations["mysql"] = {
  :adapter  => 'mysql',
  :database => 'database_name',
  :username => 'root',
  :password => '',
  :host     => 'localhost'
}


ActiveRecord::Base.configurations["sqlite3"] = {
  :adapter  => 'sqlite3',
  :database => 'db/development.sqlite3'
}

class PersonMySQL < ActiveRecord::Base
  establish_connection "mysql"
end

class PersonSQLite < ActiveRecord::Base
  establish_connection "sqlite3"
end


PersonMySQL.all.each do |person|
    PersonSQLite.create(person.attributes.except("id"))
end

Вот небольшой пост в блоге об этом http://www.seanbehan.com/how-to-export-a-mysql-database-to-json-csv-and-xml-with-ruby-and-the-activerecord-gem

5 голосов
/ 02 мая 2014

Я знаю, что это старо, но ради кого-то, кто ищет ответ ...

Есть библиотека JSON для MYSQL, которую можно найти здесь Вам необходимо иметь root-доступ к вашему серверу и удобно устанавливать плагины (это просто).

1) загрузите lib_mysqludf_json.so в каталог плагинов вашей установки mysql

2) запустите файл lib_mysqludf_json.sql (он в значительной степени сделает всю работу за вас. Если у вас возникнут проблемы, просто удалите все, что начинается с 'DROP FUNCTION ...')

3) закодируйте ваш запрос примерно так:

SELECT json_array(
         group_concat(json_object( name, email))
FROM ....
WHERE ...

и он вернет что-то вроде

[ 
   { 
     "name": "something",
     "email": "someone@somewhere.net"
    }, 
   { 
     "name": "someone",
     "email": "something@someplace.com"
    }

]
3 голосов
/ 06 марта 2014

Вы можете экспортировать любой запрос SQL в JSON напрямую из PHPMyAdmin

2 голосов
/ 09 июня 2011

, как описано в ссылке, он возвращает только (как я уже говорил) 15 результатов.(Между прочим, я проверил эти результаты против 4000, которые я должен получить, и эти 15 совпадают с первыми 15 из 4000)

Это потому, что mysql ограничивает длину возвращаемых данныхпо группам concat к значению, установленному в @@ group_concat_max_len, как только он доберется до той суммы, которую он усекает, и возвращает то, что получено.

Вы можете установить @@ group_concat_max_len несколькими различными способами.ссылка MySQL документация ...

1 голос
/ 24 ноября 2011

Кроме того, если вы экспортируете на уровне приложения, не забудьте ограничить результаты.Например, если у вас 10M строк, вы должны получать результаты по частям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...