web-dev-qa-db-ja.com

MySQLデータベースをJSONにエクスポートする方法は?

MySQLデータベースの値のサブセットをディスク上のJSON形式のファイルにエクスポートすることに興味があります。

これを行うための可能な方法について説明しているリンクを見つけました: http://www.thomasfrank.se/mysql_to_json.html

...しかし、そのページからメソッドを使用すると、動作するようですが、2つの問題があります。

1)約15件の結果のみが返され、最後の結果は突然カットオフ(不完全)されます。これに対する私の標準クエリは、SELECT name, email FROM students WHERE enrolled IS NULLとして実行するだけで約4000の結果を返しますが、次のように実行すると:

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

...リンクで説明されているように、15個の結果のみを返します(前述したとおり)。 (ちなみに、私は取得するはずの4000に対してこれらの結果をチェックしました。これらの15は4000の最初の15と同じです)

2)クエリの最後にINTO OUTFILE '/path/to/jsonoutput.txt' FIELDS TERMINATED BY ','を追加すると、実際のファイルに「エスケープ」文字が含まれているようです。したがって、カンマは「\」のように見えますが、明らかに私は\なしでコンマを持ちたいのです。

MySQLから適切なJSON出力を取得する方法に関するアイデアはありますか? (この方法、または他の方法を使用していますか?)

ありがとう!

48
mindthief

クエリから直接整形式のjsonを生成することを期待するように、MySQLに多くを求めている可能性があります。代わりに、CSV(INTO OUTFILE '/path/to/output.csv' FIELDS TERMINATED BY ','スニペットは既に知っています)、結果をpythonまたはphpなどのサポートが組み込まれた言語でjsonに変換します。

編集 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:[email protected]/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)

Rubyを使用している場合は、 mysql2xxxx gem(別のgemであるmysql2json gemではありません)をインストールできます。

$ gem install mysql2xxxx

そして、コマンドを実行します

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

Gemはmysql2csvおよびmysql2xml。 mysqldumpほど高速ではありませんが、mysqldumpの奇妙な点(MySQLサーバー自体と同じコンピューターからのみCSVをダンプできるなど)の影響も受けません。

34
Seamus Abshere

これは、アプリケーション層で実行する必要があるものです。

たとえば、PHPでは次のように単純です。

[$ = CODE!] .

$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));
10
Byron Whitlock

別の可能性は、MySQL Workbenchを使用することです。

オブジェクトブラウザーのコンテキストメニューと結果のグリッドメニューにJSONエクスポートオプションがあります。

MySQLのドキュメント:データのエクスポートとインポート の詳細。

10
Wtower

HeidiSQL を使用すると、これも実行できます。

[データ]タブまたはクエリ結果セットでデータを強調表示してから、右クリックして[グリッド行のエクスポート]オプションを選択します。このオプションを使用すると、任意のデータをJSONとして、クリップボードに直接、または直接ファイルにエクスポートできます。

enter image description here

9
jjj

別の解決策は、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

6
seanbehan

私はこれが古いことを知っていますが、答えを探している人のために...

ここにあるMYSQLのJSONライブラリがあります サーバーへのrootアクセスが必要で、プラグインのインストールを快適にする必要があります(簡単です)。

1)lib_mysqludf_json.soをmysqlインストールのpluginsディレクトリにアップロードします

2)lib_mysqludf_json.sqlファイルを実行します(ほとんどすべての作業を行います。問題が発生した場合は、「DROP FUNCTION ...」で始まるものをすべて削除してください)

3)次のようなクエリをエンコードします。

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

そしてそれは次のようなものを返します

[ 
   { 
     "name": "something",
     "email": "[email protected]"
    }, 
   { 
     "name": "someone",
     "email": "[email protected]"
    }

]
6
Patrick Pease

PHPMyAdminから直接SQLクエリをJSONにエクスポートできます

3
user2014202

リンクで説明されているように、15個の結果のみを返します(前述したとおり)。 (ちなみに、私は取得するはずの4000に対してこれらの結果をチェックしました。これらの15は4000の最初の15と同じです)

これは、mysqlがgroup concatによって返されるデータの長さを@@ group_concat_max_lenで設定された値に制限するためです。

@@ group_concat_max_lenをいくつかの異なる方法で設定できます。参照 mysqlドキュメント...

2
robot_man

また、アプリケーション層でエクスポートする場合は、結果を制限することを忘れないでください。たとえば、行が1,000万行ある場合、結果を部分的に取得する必要があります。

1

これはよりニッチな答えかもしれませんが、WindowsとMYS​​QL Workbenchを使用している場合は、必要なテーブルを選択し、結果グリッドで[エクスポート/インポート]をクリックするだけです。これにより、.jsonを含む複数の形式オプションが提供されます

0
Jason

MySQLシェルを使用すると、ターミナルのみを使用してJSONに直接出力できます

echo "Your SQL query" | mysqlsh --sql --result-format=json --uri=[username]@localhost/[schema_name]
0
VIET THANG VU

Pythonを使用してこれを行い、フィールド名などを事前定義せずにすべてのテーブルをエクスポートできるようにするために、先日、このための短いスクリプトを作成しました。

from contextlib import closing
from datetime import datetime
import json
import MySQLdb
DB_NAME = 'x'
DB_USER = 'y'
DB_PASS = 'z'

def get_tables(cursor):
    cursor.execute('SHOW tables')
    return [r[0] for r in cursor.fetchall()] 

def get_rows_as_dicts(cursor, table):
    cursor.execute('select * from {}'.format(table))
    columns = [d[0] for d in cursor.description]
    return [dict(Zip(columns, row)) for row in cursor.fetchall()]

def dump_date(thing):
    if isinstance(thing, datetime):
        return thing.isoformat()
    return str(thing)


with closing(MySQLdb.connect(user=DB_USER, passwd=DB_PASS, db=DB_NAME)) as conn, closing(conn.cursor()) as cursor:
    dump = {}
    for table in get_tables(cursor):
        dump[table] = get_rows_as_dicts(cursor, table)
    print(json.dumps(dump, default=dump_date, indent=2))
0
hwjp

次のRubyコードを使用

require 'mysql2'

client = Mysql2::Client.new(
  :Host => 'your_Host', `enter code here`
  :database => 'your_database',
  :username => 'your_username', 
  :password => 'your_password')
table_sql = "show tables"
tables = client.query(table_sql, :as => :array)

open('_output.json', 'a') { |f|       
    tables.each do |table|
        sql = "select * from `#{table.first}`"
        res = client.query(sql, :as => :json)
        f.puts res.to_a.join(",") + "\n"
    end
}
0
Rahul Malhotra