将Python列表转换为MongoDB导入的问题

1 投票
2 回答
1162 浏览
提问于 2025-04-17 04:12

我刚接触python、mongodb和sql。我在Mac 10.7上使用Eclipse 3.7.1,连接一个mssql数据库时用的是pyodbc驱动(还有freeTDS)。我在用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 个回答

0

免责声明:我对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),那么你就可以把数据添加到这个列表里,最终得到一个字典的列表,这样就和mongoDB需要的JSON格式相似了。

通过遍历这个列表,你就可以把这些数据导出到数据库中。我觉得结果会是这样的:

for item in output:
    mongooutput.append(item)

目前我能说的就这些,因为你的问题中有很多不清楚的地方:错误信息提到的一个调用我找不到;mongooutput列表没有定义;你在遍历output列表时用的括号像是在调用一个函数……总的来说,这段代码在这种状态下可能无法运行。

2

这是我让它工作的步骤:

  1. 使用pyodbc来查询mssql数据库
  2. 用python的字典和zip把元组列表转换成键值对的字典
  3. 使用pymongo把它保存为一个集合

    #===============================================================================
    # 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.

谢谢你的帮助!

撰写回答