سؤال

لدي كائن JSON في بيثون. أنا أستخدم Python DB-API و Simplejson. أحاول إدخال JSON في جدول MySQL.

في لحظة أحصل على أخطاء وأعتقد أن ذلك يرجع إلى الاقتباسات الفردية "في كائنات JSON.

كيف يمكنني إدخال كائن JSON الخاص بي في MySQL باستخدام Python؟

هذه هي رسالة الخطأ التي أحصل عليها:

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

خطأ آخر للرجوع إليه

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

إليك رابط للرمز الذي أستخدمه 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()
هل كانت مفيدة؟

المحلول

استخدم json.dumps (json_value) لتحويل كائن JSON الخاص بك (كائن Python) في سلسلة JSON التي يمكنك إدراجها في حقل نص في MySQL

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

نصائح أخرى

للتوسع في الإجابات الأخرى:

في الأساس تحتاج إلى تأكد من شيئين:

  1. أن لديك مجالًا لكامل البيانات التي تريد إدراجها في الحقل التي تحاول وضعها. يمكن أن تناسب أنواع حقل قاعدة البيانات المختلفة كميات مختلفة من البيانات. نرى: MySQL سلسلة البيانات. ربما تريد أنواع "النص" أو "blob".

  2. أنك تقوم بتمرير البيانات بأمان إلى قاعدة البيانات. يمكن أن تتسبب بعض طرق تمرير البيانات في "النظر" إلى البيانات وسيتم الخلط بينها إذا كانت البيانات تبدو مثل SQL. إنه أيضًا خطر أمني. نرى: حقن SQL

يتمثل الحل لـ #1 في التحقق من أن قاعدة البيانات مصممة بنوع الحقل الصحيح.

يتم استخدام حل #2 الاستعلامات المعلمة (ملزمة). على سبيل المثال ، بدلاً من:

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

أفضل ، استخدام:

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

أتمنى أن يساعدك هذا. إذا كان الأمر كذلك ، اسمحوا لي أن أعرف. :-)

إذا كنت لا تزال تواجه مشكلة ، فسوف نحتاج إلى فحص بناء الجملة الخاص بك عن كثب.

يجب أن تكون قادرًا على إدخال intyo نص أو عمود blob بسهولة

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

الطريقة الأكثر وضوحا لإدراج خريطة بيثون في حقل ميسكال JSON ...

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

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

قد يكون الخطأ ناتجًا عن تجاوز حجم الحقل الذي تحاول فيه إدخال JSON الخاص بك. بدون أي رمز ، من الصعب مساعدتك.

هل تفكر في نظام قاعدة بيانات NO-SQL مثل CouchDB ، وهي قاعدة بيانات موجهة نحو المستند تعتمد على تنسيق JSON؟

تحتاج إلى إلقاء نظرة على سلسلة SQL الفعلية ، جرب شيئًا كهذا:

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)

أتصور أنك ستجد بعض الاقتباسات الضالة أو الأقواس أو الأقواس هناك.

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

إليك نصيحة سريعة ، إذا كنت ترغب في كتابة بعض التعليمات البرمجية المضمنة ، فقل بقيمة JSON الصغيرة ، بدون import json. يمكنك الهروب من الاقتباسات في SQL بواسطة اقتباس مزدوج ، أي استخدام '' أو "", ، للدخول ' أو ".

عينة رمز Python (لم يتم اختباره):

q = 'INSERT INTO `table`(`db_col`) VALUES ("{k:""some data"";}")'
db_connector.execute(q)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top