J'ai un objet JSON en Python. J'utilise Python DB-API et SimpleJson. J'essaie d'insérer le JSON dans une table MySQL.
Au moment où je reçois des erreurs et je crois que cela 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 pour 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 __== '__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()
utilisez json.dumps (json_value) pour convertir votre objet json (objet python) en une chaîne json que vous pouvez insérer dans un champ de texte dans mysql
Pour développer les autres réponses:
En gros, vous devez vous assurer de deux choses:
Que vous ayez 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 contenir différentes quantités de données. Voir: Types de données de chaîne MySQL . Vous voulez probablement les types "TEXT" ou "BLOB".
Que vous transmettez en toute sécurité les données à la base de données. Certaines manières de transmettre des données peuvent amener la base de données à "regarder" les données et il y aura confusion si les données ressemblent à SQL. C'est aussi un risque de sécurité. Voir: Injection SQL
La solution pour # 1 consiste à vérifier que la base de données est conçue 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)
J'espère que cela t'aides. Si oui, faites le moi savoir. :-)
Si vous rencontrez toujours un problème, nous devrons examiner votre syntaxe de plus près.
Vous devriez pouvoir insérer facilement dans une colonne text ou blob
db.execute("INSERT INTO json_col VALUES %s", json_value)
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 envisagé un système de base de données non-sql tel que couchdb, qui est une base de données orientée document utilisant le format json?
@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)
Vous devez jeter un 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)
J'imagine que vous allez y trouver des citations, des parenthèses ou des parenthèses égarées.