web-dev-qa-db-fra.com

Insertion de JSON dans MySQL avec Python

J'ai un objet JSON en Python. J'utilise Python DB-API et SimpleJson. J'essaie d'insérer le JSON dans une table MySQL.

Au moment où je reçois des erreurs et je crois que cela est dû aux guillemets simples '' dans les objets JSON. 

Comment puis-je insérer mon objet JSON dans MySQL en utilisant Python?

Voici le message d'erreur que je reçois:

error: uncaptured python exception, closing channel 
<twitstream.twitasync.TwitterStreamPOST connected at 
0x7ff68f91d7e8> (<class '_mysql_exceptions.ProgrammingError'>:
(1064, "You have an error in your SQL syntax; check the 
manual that corresponds to your MySQL server version for 
the right syntax to use near ''favorited': '0', 
'in_reply_to_user_id': '52063869', 'contributors': 
'NULL', 'tr' at line 1") 
[/usr/lib/python2.5/asyncore.py|read|68] 
[/usr/lib/python2.5/asyncore.py|handle_read_event|390] 
[/usr/lib/python2.5/asynchat.py|handle_read|137] 
[/usr/lib/python2.5/site-packages/twitstream-0.1-py2.5.Egg/
twitstream/twitasync.py|found_terminator|55] [Twitter.py|callback|26] 
[build/bdist.linux-x86_64/Egg/MySQLdb/cursors.py|execute|166] 
[build/bdist.linux-x86_64/Egg/MySQLdb/connections.py|defaulterrorhandler|35])

Une autre erreur pour référence

error: uncaptured python exception, closing channel 
<twitstream.twitasync.TwitterStreamPOST connected at 
0x7feb9d52b7e8> (<class '_mysql_exceptions.ProgrammingError'>:
(1064, "You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right 
syntax to use near 'RT @tweetmeme The Best BlackBerry Pearl 
Cell Phone Covers http://bit.ly/9WtwUO''' at line 1") 
[/usr/lib/python2.5/asyncore.py|read|68] 
[/usr/lib/python2.5/asyncore.py|handle_read_event|390] 
[/usr/lib/python2.5/asynchat.py|handle_read|137] 
[/usr/lib/python2.5/site-packages/twitstream-0.1-
py2.5.Egg/twitstream/twitasync.py|found_terminator|55] 
[Twitter.py|callback|28] [build/bdist.linux-
x86_64/Egg/MySQLdb/cursors.py|execute|166] [build/bdist.linux-
x86_64/Egg/MySQLdb/connections.py|defaulterrorhandler|35])

Voici un lien vers le code que j'utilise http://Pastebin.com/q5QSfYLa

#!/usr/bin/env python

try:
        import json as simplejson
except ImportError:
        import simplejson

import twitstream
import MySQLdb

USER = ''
PASS = ''

USAGE = """%prog"""


conn = MySQLdb.connect(Host = "",
                       user = "",
                       passwd = "",
                       db = "")

# Define a function/callable to be called on every status:
def callback(status):

    twitdb = conn.cursor ()
    twitdb.execute ("INSERT INTO tweets_unprocessed (text, created_at, Twitter_id, user_id, user_screen_name, json) VALUES (%s,%s,%s,%s,%s,%s)",(status.get('text'), status.get('created_at'), status.get('id'), status.get('user', {}).get('id'), status.get('user', {}).get('screen_name'), status))

   # print status
     #print "%s:\t%s\n" % (status.get('user', {}).get('screen_name'), status.get('text'))

if __== '__main__':
    # Call a specific API method from the twitstream module:
    # stream = twitstream.spritzer(USER, PASS, callback)

    twitstream.parser.usage = USAGE
    (options, args) = twitstream.parser.parse_args()

    if len(args) < 1:
        args = ['Blackberry']

    stream = twitstream.track(USER, PASS, callback, args, options.debug, engine=options.engine)

    # Loop forever on the streaming call:
    stream.run()
14
Aran

utilisez json.dumps (json_value) pour convertir votre objet json (objet python) en une chaîne json que vous pouvez insérer dans un champ de texte dans mysql

http://docs.python.org/library/json.html

17
Mordi

Pour développer les autres réponses:

En gros, vous devez vous assurer de deux choses:

  1. Que vous ayez de la place pour la quantité totale de données que vous voulez insérer dans le champ que vous essayez de placer. Différents types de champs de base de données peuvent contenir différentes quantités de données. Voir: Types de données de chaîne MySQL . Vous voulez probablement les types "TEXT" ou "BLOB".

  2. Que vous transmettez en toute sécurité les données à la base de données. Certaines manières de transmettre des données peuvent amener la base de données à "regarder" les données et il y aura confusion si les données ressemblent à SQL. C'est aussi un risque de sécurité. Voir: Injection SQL

La solution pour # 1 consiste à vérifier que la base de données est conçue avec le type de champ correct.

La solution pour # 2 est d’utiliser des requêtes paramétrées (liées). Par exemple, au lieu de:

# Simple, but naive, method.
# Notice that you are passing in 1 large argument to db.execute()
db.execute("INSERT INTO json_col VALUES (" + json_value + ")")

Mieux, utilisez:

# Correct method. Uses parameter/bind variables.
# Notice that you are passing in 2 arguments to db.execute()
db.execute("INSERT INTO json_col VALUES %s", json_value)

J'espère que cela t'aides. Si oui, faites le moi savoir. :-)

Si vous rencontrez toujours un problème, nous devrons examiner votre syntaxe de plus près.

4
nonot1

Vous devriez pouvoir insérer facilement dans une colonne text ou blob

db.execute("INSERT INTO json_col VALUES %s", json_value)
1
Vince Spicer

L'erreur peut être due à un débordement de la taille du champ dans lequel vous essayez d'insérer votre json. Sans code, il est difficile de vous aider.

Avez-vous envisagé un système de base de données non-sql tel que couchdb, qui est une base de données orientée document utilisant le format json?

0
Aif
@route('/shoes', method='POST')
def createorder():
    cursor = db.cursor()
    data = request.json
    p_id = request.json['product_id']
    p_desc = request.json['product_desc']
    color = request.json['color']
    price = request.json['price']
    p_name = request.json['product_name']
    q = request.json['quantity']
    createDate = datetime.now().isoformat()
    print (createDate)
    response.content_type = 'application/json'
    print(data)
    if not data:
        abort(400, 'No data received')

    sql = "insert into productshoes (product_id, product_desc, color, price, product_name,         quantity, createDate) values ('%s', '%s','%s','%d','%s','%d', '%s')" %(p_id, p_desc, color, price, p_name, q, createDate)
    print (sql)
    try:
    # Execute dml and commit changes
        cursor.execute(sql,data)
        db.commit()
        cursor.close()        
    except:
    # Rollback changes
        db.rollback()
    return dumps(("OK"),default=json_util.default)
0
kg3

Vous devez jeter un oeil à la chaîne SQL réelle, essayez quelque chose comme ceci:

sqlstr = "INSERT INTO tweets_unprocessed (text, created_at, Twitter_id, user_id, user_screen_name, json) VALUES (%s,%s,%s,%s,%s,%s)", (status.get('text'), status.get('created_at'), status.get('id'), status.get('user', {}).get('id'), status.get('user', {}).get('screen_name'), status)
print "about to execute(%s)" % sqlstr
twitdb.execute(sqlstr)

J'imagine que vous allez y trouver des citations, des parenthèses ou des parenthèses égarées.

0
qneill