-2

psycopg2 クエリから返された有効な json である文字列を、pymongo 経由で mongo インスタンスに挿入できる json に変換するにはどうすればよいですか? いろいろ試しましたが、どれもうまくいきません。mongo への挿入で TypeError が発生し続けTypeError: 'str' object does not support item assignmentます。

ちなみに、私はPython 2.7とpsycopg2 2.4.5、およびpymongo 2.1を使用しています。必要に応じてアップグレードできます。Ubuntu と apt-get を使用してデフォルトでインストールされたものを使用しました。

import psycopg2
import pymongo
from pymongo import Connection
import ast
import json

connection = Connection()
db = connection['af_reports_test']
psa = db['psa']


cur = con.cursor()
cur.execute("SELECT activity_json FROM \"edus\".\"ACTIVITIES\" WHERE         status='PUBLISHED'")
results = cur.fetchall()


for rec in results:
    for value in rec:   
        psa.insert(value)

データベースから返されるもののサンプルを次に示します。

{"activity":{"to":{"users":["someone","someoneElse"]}}}

また、トレースバックは次のとおりです。

Traceback (most recent call last):
  File "getPSA.py", line 33, in <module>
    psa.insert(activity)
  File "/usr/lib/python2.7/dist-packages/pymongo/collection.py", line 300, in insert
    docs = [self.__database._fix_incoming(doc, self) for doc in docs]
  File "/usr/lib/python2.7/dist-packages/pymongo/database.py", line 252, in _fix_incoming
    son = manipulator.transform_incoming(son, collection)
  File "/usr/lib/python2.7/dist-packages/pymongo/son_manipulator.py", line 73, in transform_incoming
    son["_id"] = ObjectId()
TypeError: 'str' object does not support item assignment
4

1 に答える 1

1

トレースバックや問題を再現するのに十分な情報が提供されていないため、ここでは推測していますが、次のように思われます。

activity = ast.literal_eval(json.dumps(value))  

valueおそらくある種の Python オブジェクトである を取得し、呼び出してjson.dumpsそのオブジェクトを表す JSON 文字列に変換し、呼び出しast.literal_evalて元のオブジェクトに戻します。それはおそらく役に立ちません。

一方、エラーは、他の種類のオブジェクト (おそらくリストまたはその他の変更可能なシーケンス) を期待しているときに、文字列があることを示しているようです。valueが既に JSON 文字列である場合は、そこjson.loadsから Python オブジェクトを取得するために使用します。Python リテラル文字列自体の場合ast.literal_evalは、元の文字列を表す JSON 文字列ではなく、文字列に対して使用します。それが何か他のものである場合は…まあ、それを解読する方法を知るには、他のものを知る必要があります. 私が確信できる唯一のことは、あなたのコードが役立つ可能性があるとは考えられないということです.

于 2013-10-23T23:40:07.297 に答える