Comment exporter une firebase database MySQL vers JSON?

Je suis intéressé à exporter un sous-ensemble de valeurs d’une firebase database MySQL dans un fichier au format JSON sur le disque.

J’ai trouvé un lien qui parle d’un moyen possible de le faire: http://www.thomasfrank.se/mysql_to_json.html

… mais quand j’utilise la méthode depuis cette page, cela semble fonctionner mais avec deux problèmes:

1) Il ne renvoie que 15 résultats environ, le dernier étant brusquement coupé (incomplet). Ma requête standard pour cela renvoie environ 4 000 résultats lorsque je l’exécute simplement en tant que SELECT name, email FROM students WHERE enrolled IS NULL Mais quand je l’exécute en tant que:

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

… comme décrit dans le lien, il ne renvoie que 15 résultats. (fwiw, j’ai vérifié ces résultats contre les 4000 que je suis censé obtenir, et ces 15 sont les mêmes que les 15 premiers des 4000)

2) Il semble y avoir des caractères “escape” dans le fichier lorsque j’ajoute INTO OUTFILE '/path/to/jsonoutput.txt' FIELDS TERMINATED BY ',' à la fin de cette requête. Donc, les virgules finissent par ressembler à ‘\’, alors que je voudrais simplement avoir les virgules sans les \.

Des idées sur la façon d’obtenir une sortie JSON correcte de MySQL? (Soit en utilisant cette méthode, ou une autre méthode)?

Merci!

Il peut être trop demander à MySQL de s’attendre à ce qu’il produise un fichier json bien formé directement à partir d’une requête. Au lieu de cela, envisagez de produire quelque chose de plus pratique, comme CSV (en utilisant le INTO OUTFILE '/path/to/output.csv' FIELDS TERMINATED BY ',' vous connaissez déjà), puis en transformant les résultats en json dans un langage avec prise en charge intégrée pour cela, comme python ou php.

Modifiez l’ exemple de python en utilisant 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 "" % (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.Ssortingng(100)), sqlalchemy.Column('email', sqlalchemy.Ssortingng(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) 

Si vous avez Ruby, vous pouvez installer la gem mysql2xxxx (pas la gem mysql2json, qui est un bijou différent):

 $ gem install mysql2xxxx 

puis exécutez la commande

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

La gem fournit également mysql2csv et mysql2xml . Ce n’est pas aussi rapide que mysqldump, mais il ne souffre pas non plus des bizarreries de mysqldump (comme être capable de vider CSV du même ordinateur que le serveur MySQL lui-même).

C’est quelque chose qui devrait être fait dans la couche application.

Par exemple, en php, c’est aussi simple que

Modifier Ajout de la connexion à la firebase database. Aucun externe quoi que ce soit nécessaire.

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

Une autre possibilité est d’utiliser MySQL Workbench.

Il existe une option d’exportation JSON dans le menu contextuel du navigateur d’objects et dans le menu de la grid de résultats.

Plus d’informations sur la documentation MySQL: Exportation et importation de données .

HeidiSQL vous permet de le faire également.

Mettez en surbrillance les données de l’onglet DATA ou du jeu de résultats de la requête … puis cliquez avec le bouton droit de la souris et sélectionnez l’option Exporter les lignes de la grid. Cette option vous permet ensuite d’exporter vos données en JSON, directement dans le presse-papiers ou directement dans un fichier:

entrer la description de l'image ici

Une autre solution, si vous utilisez Ruby, consiste à écrire un script de connexion dans la firebase database avec ActiveRecord. Vous devrez d’abord l’installer

gem installer 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 } 

Vous pouvez également append des méthodes aux classes ActiveRecord si vous souhaitez manipuler les données en premier ou inclure ou exclure certaines colonnes.

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

Avec ActiveRecord, vous n'êtes pas limité à JSON. Vous pouvez aussi facilement exporter en XML ou YAML

 Person.all.to_xml Person.all.to_yaml 

Vous n'êtes pas limité à MySQL. Toute firebase database prise en charge par ActiveRecord (Postgres, SQLite3, Oracle, etc.).

Et il convient de mentionner que vous pouvez ouvrir un autre handle à une firebase database

 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 

Voici un petit article sur le blog http://www.seanbehan.com/how-to-export-a-mysql-database-to-json-csv-and-xml-with-ruby-and-the-activerecord -gemme

Je sais que c’est vieux, mais pour quelqu’un qui cherche une réponse …

Il existe une bibliothèque JSON pour MYSQL qui peut être trouvée ici. Vous devez avoir un access root à votre serveur et être à l’aise pour installer des plugins (c’est simple).

1) téléchargez le fichier lib_mysqludf_json.so dans le répertoire plugins de votre installation mysql

2) exécutez le fichier lib_mysqludf_json.sql (cela fait tout le travail pour vous. Si vous rencontrez des problèmes, supprimez simplement tout ce qui commence par «DROP FUNCTION …»)

3) encodez votre requête en quelque chose comme ceci:

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

et il retournera quelque chose comme

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

comme décrit dans le lien, il ne renvoie que 15 résultats. (fwiw, j’ai vérifié ces résultats contre les 4000 que je suis censé obtenir, et ces 15 sont les mêmes que les 15 premiers des 4000)

C’est parce que mysql limite la longueur des données renvoyées par groupe concat à la valeur définie dans @@ group_concat_max_len dès qu’il atteint le montant qu’il tronque et retourne ce qu’il a obtenu jusqu’à présent.

Vous pouvez définir @@ group_concat_max_len de différentes manières. reference La documentation mysql …

Vous pouvez exporter n’importe quelle requête SQL dans JSON directement depuis PHPMyAdmin

En outre, si vous exportez en couche application, n’oubliez pas de limiter les résultats. Par exemple, si vous avez 10M de lignes, vous devriez obtenir des résultats une par une.

Utilisez le code ruby ​​suivant

 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 } 

Pour quiconque veut le faire en utilisant Python et pouvoir exporter toutes les tables sans prédéfinir les noms de champs, etc.

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

Cela peut être une réponse plus niche, mais si vous utilisez Windows et MYSQL Workbench, vous pouvez simplement sélectionner la table de votre choix et cliquer sur Exporter / Importer dans la grid de résultats. Cela vous donnera plusieurs options de format, y compris .json