2010-11-22 9 views
11

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

Au moment où je reçois des erreurs et je crois que c'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 de 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 __name__ == '__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() 
+0

Une copie de l'erreur message serait utile :) – shawnjan

+0

Quel code utilisez-vous pour réellement insérer les données JSON dans la base de données? –

+1

Espérons que c'est une question stupide, mais utilisez-vous (espérons-le) des variables de liaison? – Gerrat

Répondre

0

Le 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 considéré un système de base de données no-sql tel que couchdb, qui est une base de données orientée document reposant sur le format json?

+0

MySQL est seulement une option pour une utilisation avec un site web externe ... – Aran

+0

Les deux erreurs montrées par OP contiennent: "Vous avez une erreur dans votre syntaxe SQL; ...". Cela n'a rien à voir avec un débordement de – Gerrat

1

Vous devriez être en mesure d'insérer intyo une colonne de texte ou blob facilement

db.execute("INSERT INTO json_col VALUES %s", json_value) 
4

développiez les autres réponses:

Fondamentalement, vous avez besoin de se assurer de deux choses:

  1. Que vous avez 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 s'adapter à différentes quantités de données. Voir: MySQL String Datatypes. 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 façons de transmettre des données peuvent amener la base de données à "regarder" les données et elles seront confuses si les données ressemblent à du SQL. C'est aussi un risque de sécurité. Voir: SQL Injection

La solution n ° 1 est de vérifier que la base de données est conçu 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) 

Hope this helps. Si oui, faites le moi savoir. :-)

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

+0

@Aran Est-ce que ma réponse a aidé? Si oui, répondez et marquez la réponse .. merci. :) – nonot1

+0

Je viens de télécharger mon code et semble toujours avoir des erreurs j'essaie diverses façons d'écrire la requête SQL ... – Aran

0

Vous devez obtenir un coup d'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) 

Je suppose que vous allez trouver des citations errants, des crochets ou des parenthèses là-dedans.

+0

Ok, si j'ai des guillemets, des parenthèses ou des parenthèses, comment est-ce que je peux préparer la chaîne pour l'utiliser avec SQL est là une fonction dans Python DB-API? – Aran

+0

Pour une erreur dans la syntaxe SQL, "préparer la chaîne pour une utilisation avec SQL" signifierait la fixation de la syntaxe ... probablement pas un appel d'API pour cela :) Publiez la sortie de "sur le point d'exécuter ..." déclaration. – qneill

1
@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) 
Questions connexes