Question

J'ai un objet JSON en Python. J'utilise Python DB-API et simplejson. Je suis en train d'insérer le JSON dans une table MySQL.

Au moment où je suis obtenir des erreurs et je crois qu'il est en raison des guillemets simples « » dans le JSON Objets.

Comment puis-je insérer mon JSON objet 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()
Était-ce utile?

La solution

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

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

Autres conseils

Pour développer les autres réponses:

Classiquement, vous devez vous assurer de deux choses:

  1. Que vous avez de la place pour toute la quantité de données que vous souhaitez insérer dans le champ que vous essayez de le placer. Différents types de champs de base de données peuvent adapter à différentes quantités de données. Voir: MySQL chaîne Datatypes. Vous voulez sans doute le "texte" ou "types" BLOB.

  2. Que vous soyez de passage en toute sécurité les données à la base de données. Voici quelques façons de données transitant peuvent causer la base de données « regard » sur les données et vont se confondre si les regards de données comme SQL. Il est également 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 n ° 2 est l'utilisation paramétrés (liés) requêtes. 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, laissez-moi savoir. : -)

Si vous avez encore un problème, alors nous aurons besoin d'examiner votre syntaxe plus près.

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

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

La façon la plus simple d'insérer une carte de python dans un champ MySQL JSON ...

python_map = { "foo": "bar", [ "baz", "biz" ] }

sql = "INSERT INTO your_table (json_column_name) VALUES (%s)"
cursor.execute( sql, (json.dumps(python_map),) )

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 prévenants un système de base de données sans sql telles que CouchDB, qui est un document axé sur la base de données se fondant sur le format JSON?

Vous devez obtenir un coup d'oeil à la chaîne SQL réelle, essayer 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.

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

Voici une astuce rapide, si vous voulez écrire un code en ligne, par exemple pour une petite valeur JSON, sans import json. Vous pouvez échapper les guillemets dans SQL par une double citation, à savoir l'utilisation '' ou "", pour entrer ' ou ".

code Python échantillon (non testé):

q = 'INSERT INTO `table`(`db_col`) VALUES ("{k:""some data"";}")'
db_connector.execute(q)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top