Pregunta

Tengo un objeto JSON en Python. Estoy usando Python DB-API y simplejson. Estoy tratando de insertar el JSON en una tabla de MySQL.

Al momento estoy recibiendo errores y creo que se debe a las comillas simples '' en el JSON objetos.

¿Cómo puedo insertar objetos JSON en MySQL usando Python?

Aquí está el mensaje de error que consigo:

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

Otro error para la referencia

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

Aquí hay un enlace al código que estoy usando 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()
¿Fue útil?

Solución

json.dumps

json_value uso () para convertir el objeto JSON (objeto pitón) en una cadena JSON que se puede insertar en un campo de texto en mysql

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

Otros consejos

Para ampliar sobre las otras respuestas:

Básicamente, usted tiene que asegurarse de dos cosas:

  1. Eso tiene espacio para la cantidad total de datos que desea insertar en el campo que usted está tratando de colocarlo. Los diferentes tipos de campos de base de datos pueden adaptarse a diferentes cantidades de datos. Ver: MySQL cadena tipos de datos . Es posible que desee el tipo "blob" "TEXTO" o.

  2. Esto está de paso de forma segura los datos a la base de datos. Algunas formas de datos que pasan pueden causar la base de datos de "look" en los datos y que se confunde, si las miradas de datos como SQL. Es también un riesgo para la seguridad. Ver: inyección SQL

La solución para # 1 es comprobar que la base de datos está diseñado con el tipo de campo correcto.

La solución para # 2 es el uso parametrizado (encuadernadas) consultas. Por ejemplo, en lugar 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 + ")")

Mejor, utilice:

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

Espero que esto ayude. Si es así, hágamelo saber. : -)

Si sigue teniendo un problema, entonces tendremos que examinar su sintaxis más de cerca.

debe ser capaz de insertar en una columna de texto o mancha fácilmente

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

La forma más sencilla de insertar un mapa de pitón en un campo de 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),) )

El error puede ser debido a un desbordamiento del tamaño del campo en el que se intenta insertar su JSON. Sin ningún código, es difícil para ayudarle.

¿Usted ha considerado un sistema de base de datos no-SQL como couchdb, que es una base de datos documental confiar en formato JSON?

Es necesario echar un vistazo a la cadena SQL real, intentar algo como esto:

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)

Me imagino que vas a encontrar algunas citas callejeros, soportes o paréntesis en ese país.

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

He aquí un consejo rápido, si quieres escribir algo de código en línea, digamos por un valor pequeño JSON, sin import json. Puede escapar cotizaciones en SQL por una doble cotización, es decir, el uso '' o "", para entrar ' o ".

código Python de muestra (no probado):

q = 'INSERT INTO `table`(`db_col`) VALUES ("{k:""some data"";}")'
db_connector.execute(q)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top