如何将MySQL数据库导出到JSON?

min*_*ief 50 mysql sql json

我有兴趣将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;
Run Code Online (Sandbox Code Playgroud)

......如链接中所述,它只返回(如我所述)15个结果.(fwiw,我检查了这些结果与4000我应该得到的,这15个与4000的前15个相同)

2)当我添加INTO OUTFILE '/path/to/jsonoutput.txt' FIELDS TERMINATED BY ','到该查询的末尾时,实际文件中似乎包含"转义"字符.因此,逗号最终看起来像'\',显然我只想拥有没有\的逗号.

关于如何从MySQL获取正确的JSON输出的任何想法?(使用此方法或其他方法)?

谢谢!

Sea*_*ere 34

如果你有Ruby,你可以安装mysql2xxxx gem(而不是mysql2json gem,这是一个不同的gem):

$ gem install mysql2xxxx
Run Code Online (Sandbox Code Playgroud)

然后运行该命令

$ mysql2json --user=root --password=password --database=database_name --execute "select * from mytable" >mytable.json
Run Code Online (Sandbox Code Playgroud)

宝石还提供mysql2csvmysql2xml.它没有mysqldump那么快,但也没有遭受一些mysqldump的怪异(比如只能从与MySQL服务器本身相同的计算机中转储CSV)


Sin*_*ion 19

它可能要求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)
Run Code Online (Sandbox Code Playgroud)


Wto*_*wer 11

另一种可能性是使用MySQL Workbench.

对象浏览器上下文菜单和结果网格菜单中有一个JSON导出选项.

有关MySQL文档的更多信息:数据导出和导入.


Byr*_*ock 10

这是应该在应用程序层中完成的事情.

例如,在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));
Run Code Online (Sandbox Code Playgroud)


jjj*_*jjj 9

HeidiSQL也允许你这样做.

突出显示"数据"选项卡或查询结果集中的任何数据...然后右键单击并选择"导出网格行"选项.然后,此选项允许您将任何数据导出为JSON,直接导出到剪贴板或直接导出到文件:

在此输入图像描述


sea*_*han 6

如果您使用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 }
Run Code Online (Sandbox Code Playgroud)

如果要首先操作数据或包含或排除某些列,还可以向ActiveRecord类添加方法.

Person.all.to_json(:only => [ :id, :name ])
Run Code Online (Sandbox Code Playgroud)

使用ActiveRecord,您不仅限于JSON.您可以像XML或YAML一样轻松导出

Person.all.to_xml
Person.all.to_yaml
Run Code Online (Sandbox Code Playgroud)

您不仅限于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
Run Code Online (Sandbox Code Playgroud)

这是一篇关于它的快速小博客文章http://www.seanbehan.com/how-to-export-a-mysql-database-to-json-csv-and-xml-with-ruby-and-the-activerecord -宝石


小智 6

您可以直接从 PHPMyAdmin 将任何 SQL 查询导出为 JSON

  • 请提供更多详细信息!我在任何地方都找不到这个选项。 (2认同)

Pat*_*ase 6

我知道这是旧的,但是为了寻找答案的人...

有一个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 ...
Run Code Online (Sandbox Code Playgroud)

它会返回类似的东西

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

]
Run Code Online (Sandbox Code Playgroud)