sourcecode

MySQL 데이터베이스를 JSON으로 내보내는 방법

copyscript 2022. 9. 21. 23:25
반응형

MySQL 데이터베이스를 JSON으로 내보내는 방법

MySQL 데이터베이스에서 디스크의 JSON 형식 파일로 값 일부를 내보내는 데 관심이 있습니다.

가능한 방법에 대한 링크를 찾았습니다.http://www.thomasfrank.se/mysql_to_json.html

...하지만, 그 페이지의 방법을 사용하면, 동작하는 것처럼 보이지만, 다음의 2개의 문제가 있습니다.

1) 15개 정도의 결과만 반환하고 마지막 1개는 갑자기 절단(불완전)됩니다.합니다.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개의 결과만 반환됩니다.(fwiw, 이 결과를 4000과 비교했는데, 이 15개는 4000의 첫 번째 15와 동일합니다.)

2)에는 2) 을 때 이스케이프되어 있는 것 .INTO OUTFILE '/path/to/jsonoutput.txt' FIELDS TERMINATED BY ','그 쿼리가 끝날 때까지요.콤마는 ''로 표시됩니다.이것은, 확실히 「\」를 제외하고 싶은 경우입니다.

MySQL에서 적절한 JSON 출력을 얻는 방법에 대한 아이디어가 있습니까? (이 메서드를 사용하거나 다른 메서드를 사용하시겠습니까?)

감사합니다!

Ruby가 있는 경우 mysql2xxxx gem(mysql2json gem이 아닌 다른 gem)을 설치할 수 있습니다.

$ gem install mysql2xxxx

명령어를 실행합니다.

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

보석은 또한 이 provides provides the the the the 。mysql2csv ★★★★★★★★★★★★★★★★★」mysql2xml 컴퓨터에서 수 것 등)에도 시달리지 mysqldump는 mysqldump의 MySQL의 이상함에 않습니다

쿼리에서 직접 제대로 형성된 json을 생성하기 위해서는 MySQL에 너무 많은 것을 요구할 수 있습니다.CSVCSV'를 사용 보다 한 것을 하는 것을 .INTO OUTFILE '/path/to/output.csv' FIELDS TERMINATED BY ','이미 알고 있는 스니펫)을 사용하여 결과를 python이나 php와 같은 지원 기능이 내장된 언어로 json으로 변환합니다.

fine SQL Chemy를 사용하여 python 예를 편집합니다.

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)

MySQL Workbench를 사용할 수도 있습니다.

오브젝트 브라우저의 컨텍스트메뉴와 결과 그리드메뉴에는 JSON 내보내기 옵션이 있습니다.

MySQL 문서에 대한 자세한 내용은 다음과 같습니다. 데이터 내보내기가져오기

HeidiSQL을 사용하면 이 작업도 수행할 수 있습니다.

DATA 탭 또는 쿼리 결과 집합에서 데이터를 강조 표시합니다.마우스 오른쪽 버튼을 클릭하고 그리드 행 내보내기 옵션을 선택합니다.이 옵션을 사용하면 데이터를 JSON으로 직접 클립보드로 내보내거나 파일로 직접 내보낼 수 있습니다.

여기에 이미지 설명 입력

이것은 어플리케이션레이어에서 실행해야 하는 작업입니다.

예를 들어, php에서는 s는 다음과 같이 단순합니다.

편집 DB 연결 정보를 추가했습니다.외부적인 것은 필요 없습니다.

$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));

오래된 건 알지만 답을 찾는 사람을 위해서...

MYSQL용 JSON 라이브러리는 이쪽에서 찾을 수 있습니다.서버에 root 액세스 할 수 있고 플러그인 설치에 익숙해야 합니다(간단합니다).

1) lib_mysqludf_json.so를 mysql 설치 플러그인 디렉토리에 업로드합니다.

2) lib_mysqludf_json.sql 파일을 실행합니다(거의 모든 작업을 수행합니다).문제가 발생하면 'DROP FUNTION...'으로 시작하는 항목을 삭제하십시오.

3) 다음과 같이 쿼리를 인코딩합니다.

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

그리고 그것은 다음과 같은 것을 돌려줄 것이다.

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

]

Ruby 를 사용하고 있는 경우는, ActiveRecord 를 사용해 데이터베이스에 접속 스크립트를 작성하는 방법도 있습니다.먼저 설치해야 합니다.

gem 설치 활성 레코드

# 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 ])

Active Record를 사용하면 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

임의의 SQL 쿼리를 PHPmyAdmin에서 직접 JSON으로 내보낼 수 있습니다.

MySQL Shell을 사용하면 터미널만 사용하여 JSON에 직접 출력할 수 있습니다.

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

링크에 기재되어 있는 바와 같이 15개의 결과만 반환됩니다.(fwiw, 이 결과를 4000과 비교했는데, 이 15개는 4000의 첫 번째 15와 동일합니다.)

이는 mysql이 지금까지 얻은 데이터를 잘라내 반환하는 양에 도달하자마자 그룹에 의해 반환되는 데이터의 길이를 @group_concat_max_len에서 설정된 값으로 제한하기 때문입니다.

@@group_concat_max_len은 몇 가지 방법으로 설정할 수 있습니다.mysql 문서를 참조합니다...

또, 애플리케이션 레이어로 export 하는 경우는, 반드시 결과를 제한해 주세요.예를 들어, 1000만 행이 있는 경우 부분별로 결과를 얻어야 합니다.

다음 루비 코드를 사용합니다.

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
}

이것이 더 적합한 답변일 수 있지만 Windows 및 MYSQL Workbench를 사용하는 경우 원하는 테이블을 선택하고 결과 그리드에서 내보내기/가져오기 버튼을 클릭하기만 하면 됩니다.그러면 .json을 포함한 여러 형식 옵션이 제공됩니다.

제가 찾은 가장 간단한 해결책은mysql그리고.jq명령어JSON_OBJECT질문합니다. 사실jqJSON Lines 형식이 충분한 경우 가 필요하지 않습니다.

리모트 서버에서 로컬파일로 덤프하는 예.

ssh remote_server \
    "mysql \
        --silent \
        --raw \
        --host "" --port 3306 \
        --user "" --password="" \
        table \
        -e \"SELECT JSON_OBJECT('key', value) FROM table\" |
    jq --slurp --ascii-output ." \
> dump.json

books표의 예

+----+-------+
| id | book  | 
+----+-------+
| 1  | book1 | 
| 2  | book2 | 
| 3  | book3 | 
+----+-------+

쿼리는 다음과 같습니다.

SELECT JSON_OBJECT('id', id, 'book', book) FROM books;

dump.json산출량

[
    {
        "id": "1",
        "book": "book1"
    },
    {
        "id": "2",
        "book": "book2"
    },
    {
        "id": "3",
        "book": "book3"
    }
]

2021년에 답을 찾는 사람이 있다면 MySql Shell을 사용하여 이 방법을 찾을 수 있습니다.

https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-json-output.html

콘솔에서 mysql을 연결하여 사용할 수 있는 JS 엔진으로 매우 좋지만 11년 전에는 존재하지 않았습니다.

Python을 사용하여 이 작업을 수행하고 필드 이름을 미리 정의하지 않고 모든 테이블을 내보낼 수 있기를 원하는 사용자를 위해 요전 날 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))

이 답변들 중 많은 부분이 지나치게 조작된 것 같습니다.조개껍데기로만 무장하고mysql이 작업은 명령줄에서 수행할 수 있습니다.

이름이 지정된 데이터베이스 가정mydb와 같이 간단하다

for t in $(mysql -Bse "select table_name from information_schema.tables where table_schema = 'mydb'")
  do
    mysql -Bse "select concat('select json_object(', group_concat('''', column_name, ''',', column_name), ') from ', table_name, ';') from information_schema.columns where table_schema='mydb' and table_name='$t'" mydb \
      | mysql -Bs mydb > $t.json
done

이를 실행하면 테이블당 1개의 json 파일이 생성되며 프로그래밍 언어는 필요하지 않습니다.

답변의 핵심은 다음 질문입니다.information_schema:

select concat(
    'select json_object(',
    group_concat(
        '''',
        column_name,
        ''',',
        column_name
    ),
    ') from ',
    table_name,
    ';')
from information_schema.columns
where table_schema = 'mydb'
    and table_name = ?

언급URL : https://stackoverflow.com/questions/5036605/how-to-export-a-mysql-database-to-json

반응형