Frage

Ich habe ein JSON-Objekt in Python. Ich verwende Python DB-API und simplejson. Ich versuche, die json in eine MySQL-Tabelle einzufügen.

Im Moment Fehler ist immer und ich glaube, es ist darauf zurückzuführen, die einfachen Anführungszeichen ‚‘ im JSON-Objekten.

Wie kann ich mein JSON-Objekt in MySQL mit Python einfügen?

Hier ist die Fehlermeldung erhalte ich:

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

Ein weiterer Fehler Referenz

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

Hier ist ein Link zu dem Code, den ich verwende 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()
War es hilfreich?

Lösung

Verwendung json.dumps (json_value) Ihr JSON-Objekt (Python-Objekt) in einem JSON-String konvertieren, dass Sie in einem Textfeld einfügen können in mysql

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

Andere Tipps

auf den anderen Antworten erweitern:

Im Grunde braucht man sicher zwei Dinge machen:

  1. Dass Sie Raum für die volle Menge an Daten, die Sie im Feld einfügen möchten, dass Sie versuchen, es zu platzieren. Unterschiedliche Datenbankfeldtypen können unterschiedliche Mengen an Daten passen. Siehe: MySQL String-Datentypen . Sie wollen wahrscheinlich die "TEXT" oder "BLOB" -Typen.

  2. Dass Sie sicher die Daten in der Datenbank sind vorbei. Einige Wege der Übergabe von Daten können die Datenbank zu „Look“ verursachen die Daten an, und es wird, wenn die Daten sehen aus wie SQL verwirren. Es ist auch ein Sicherheitsrisiko. Siehe: SQL Injection

Die Lösung für die # 1 ist zu prüfen, ob die Datenbank mit dem richtigen Feldtyp ausgelegt ist.

Die Lösung für # 2 ist, parametriert (gebunden) Abfragen. Zum Beispiel statt:

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

Besser, zu verwenden:

# 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, das hilft. Wenn ja, lassen Sie mich wissen. : -)

Wenn Sie immer noch ein Problem haben, dann müssen wir die Syntax näher untersuchen.

Sie sollten in der Lage sein, in einen Text oder Blob-Spalte einfügen leicht

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

Der einfachste Weg, um eine Python-Karte in ein MySQL-JSON-Feld einfügen ...

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

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

Der Fehler kann zu einem Überlauf der Größe des Feldes zurückzuführen sein, in dem Sie versuchen, Ihre json einzufügen. Ohne Code ist es schwer, Ihnen zu helfen.

Haben Sie ein No-SQL-Datenbanksystem rücksichtsvoll wie CouchDB, die ein Dokument orientierte Datenbank auf JSON-Format zu verlassen ist?

Sie müssen einen Blick auf die tatsächliche SQL-String erhalten, versuchen, etwas wie folgt aus:

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)

ich denke, Sie werden einige Streu Anführungszeichen, Klammern oder Klammern in dort finden.

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

Hier ist ein kurzer Tipp, wenn Sie einige Inline-Code schreiben wollen, sagen für einen kleinen json Wert, ohne import json. Sie können Anführungszeichen in SQL durch eine doppelte zitiert, das heißt Verwendung '' oder "", Flucht ' oder " eingeben.

Beispiel Python-Code (nicht getestet):

q = 'INSERT INTO `table`(`db_col`) VALUES ("{k:""some data"";}")'
db_connector.execute(q)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top