将Python列表转换为MongoDB导入的问题
我刚接触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
这是我让它工作的步骤:
- 使用pyodbc来查询mssql数据库
- 用python的字典和zip把元组列表转换成键值对的字典
使用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.
谢谢你的帮助!