Проблемы с преобразованием списка Python для импорта из mongodb - PullRequest
1 голос
/ 13 октября 2011

Я новичок в python, mongodb и sql. Я работаю в Eclipse 3.7.1 на Mac 10.7. Я использую драйвер pyodbc (и freeTDS) для подключения к базе данных mssql. Я пишу скрипты в Python 2.7. Я хочу запросить базу данных mssql и записать ее в базу данных mongo.

Где я спотыкаюсь, так это то, что выходные данные запроса находятся в списке кортежей Python без имен полей, и я ищу способ преобразовать этот список кортежей в форму, которую будет импортировать mongodb.

Текущий скрипт:

    ############
    # Query mssql
    import pyodbc
    import json
    url = 'DSN=myServer;UID=myUserName;PWD=myPassword;PORT=1433;DATABASE=mydb'
    pyodbccon = pyodbc.connect(url)
    cursor = pyodbccon.cursor()

    numusersQ = "SELECT COUNT(users.userid) FROM users"; 
    cursor.execute(numusersQ); numusers = cursor.fetchall()
    nummembsQ = "SELECT COUNT(memberships.membernumber) FROM memberships"; 
    cursor.execute(nummembsQ); nummembs = cursor.fetchall()
    userclientQ = "SELECT users.userid, users.client, users.industry FROM users"
    cursor.execute(userclientQ); userclient = cursor.fetchall()

    #format key value tuples
    output = []
    for row in userclient:
        tuplenew = {'userid': row[0], 'client': row[1], 'industry': row[2], 'numusers': numusers, 'nummembs': nummembs}
        output = [output, tuplenew]


    #output to mongo
    from pymongo.connection import Connection ;
    conmongo = Connection('localhost') 
    db = conmongo.mypymongodb

    for key, value in output():
        temp = [key,value]
        mongooutput.append(temp)

    db.pymongocollection.save(mongooutput)
    cursor = db.pymongocollection.find() 

############

ВЫХОД выглядит как:

[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[], {'numusers': [(103068, )], 'industry': 'npwild', 'client': 'cmh', 'userid': 1, 'nummembs': [(10519, )]}], {'numusers': [(103068, )], 'industry': 'npwild', 'client': 'cmh', 'userid': 2, 'nummembs': [(10519, )]}], {'numusers': [(103068, )], 'industry': 'npwild', 'client': 'cmh', 'userid': 3, 'nummembs': [(10519, )]}], {'numusers': [(103068, )], 'industry': 'npwild', 'client': 'cmh', 'userid': 5, 'nummembs': [(10519, )]}]

СООБЩЕНИЕ ОБ ОШИБКЕ:

Traceback (most recent call last):
  File "/Users/eclipse/workspace/pymongo/pymongopkg.py", line 34, in <module>
    for key, value in output():
TypeError: 'list' object is not callable

Если кто-то может просто предложить функцию или направить меня к решению, я был бы очень рад.

Ответы [ 2 ]

1 голос
/ 13 октября 2011

вот как я заставил его работать:

  1. pyodbc для запроса базы данных mssql
  2. python dict и zip для преобразования списка кортежей в пары словарь ключ-значение
  3. Пимонго, чтобы сохранить его как коллекцию

    #===============================================================================
    # 1. MSSQL QUERY WITH PYODBC
    #===============================================================================
    import pyodbc
    url = 'DSN=myserver;UID=myusername;PWD=mypassword;PORT=1433;DATABASE=mydatabase;'
    pyodbccon = pyodbc.connect(url); cursor = pyodbccon.cursor()
    
    userdataQ = "SELECT users.userid, users.client, users.industry FROM users"
    cursor.execute(userdataQ); userdata = cursor.fetchall()
    
    ##===============================================================================
    ## 2. convert tuple list to key-value dictionary
    ## 3. export to mongodb
    ##===============================================================================        
    from pymongo import Connection; conmongo = Connection('localhost') 
    db = conmongo.mypymongodb #mypymongodb = dbname
    headers = ['userid','client','industry'] 
    
    for tup in userdata:
        nextdoc = dict(zip(headers, tup))
        db.usercollection.save(nextdoc)
    print "usercollection in mypymongodb updated with " + str(db.usercollection.count()) + " docs"
    

выход:

> db.usercollection.find()
{ "_id" : ObjectId("4ef000000"), "industry" : "npwild", "client" : "cmh", "userid" : 1 }
{ "_id" : ObjectId("4ef000001"), "industry" : "npwild", "client" : "cmh", "userid" : 2 }
{ "_id" : ObjectId("4ef000002"), "industry" : "npwild", "client" : "cmh", "userid" : 3 }
etc.

спасибо за вашу помощь! -d

0 голосов
/ 13 октября 2011

Отказ от ответственности: у меня нет опыта работы с mongoDB, но, поскольку он, кажется, импортирует данные в формате JSON, похоже, что вы почти у цели.

Проблема, которую я вижу, заключается в этой части:

output = []
for row in userclient:
    tuplenew = {'userid': row[0], 'client': row[1], 'industry': row[2], 'numusers': numusers, 'nummembs': nummembs}
    output = [output, tuplenew] # <--- problematic line

То, что вы здесь делаете, это назначаете список output себе. Если вы просто добавите элементы к нему, заменив проблемную строку на output.append(tuplenew), вы получите список словарей; аналогично вашему формату JSON, необходимому для mongoDB.

Перебирая этот список, вы можете экспортировать элементы в базу данных. Я думаю тогда это будет выглядеть так:

for item in output:
    mongooutput.append(item)

Это все, что я могу сказать сейчас, потому что в вашем вопросе есть некоторые неясные вещи: в следе упоминается звонок, который я не могу найти; список mongooutput не определен; ваша итерация по списку output использует скобки, как если бы она вызывала функцию ... в общем, код вряд ли будет работать в этом состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...