[英]Pymongo, TypeError : expected a character buffer object
I'm trying to connect and to read data in a MongoDB database, to learn Python. 我正在尝试连接并读取MongoDB数据库中的数据,以学习Python。 I'm using Pymongo and I have this error : 我正在使用Pymongo,但出现此错误:
Traceback (most recent call last):
File "secondtest.py", line 107, in <module>
user_info = dbco.find({})
TypeError: expected a character buffer object
This is my database.ini : 这是我的database.ini:
[postgresql]
host=monhostname
database=monpass
port=15000
user=monuser
password=monpass
[mongodb]
hostname=127.0.0.1
database=Mydatabase
username=Myname
password=Myn@me!
collection=measure
port=27017
And my code using it : 和我的代码使用它:
# -*- coding: utf-8 -*-
# secondtest.py
import psycopg2
import sys
import pymongo
from urllib import quote_plus
from pymongo import MongoClient
from configparser import ConfigParser
# Connection information in database.ini
params = ''
mongollection = ''
# Variables to connect to a database, to use a cursor object and to fetch all results from a query
mongoClient = ''
pgsqlClient = ''
pgsqlCursor = ''
pgsqlRecords = ''
mongoRecords = ''
dbco = ''
# Retrieve connection information from ini file
def dbConfig(section, filename='database.ini'):
# Create a parser
parser = ConfigParser()
# Read config file
parser.read(filename)
# Get section, depending on the database engine
db = {}
if parser.has_section(section):
params = parser.items(section)
for param in params:
db[param[0]] = param[1]
else:
raise Exception('Section {0} not found in the {1} file'.format(section, filename))
# Return data or directly as a string
if section == 'postgresql':
return db
elif section == 'mongodb':
host = ''
username = ''
passwd = ''
port = ''
dbmongo = ''
connectstring = ''
# Make a string to connect to MongoDB
for key, value in db.iteritems():
if key == 'hostname':
host = value.encode("utf-8")
elif key == 'username':
username = value
elif key == 'password':
passwd = value
elif key == 'database':
dbmongo = value
elif key == 'collection':
mongollection = value
elif key == 'port':
port = value
connectstring = "mongodb://" + username + ":" + quote_plus(passwd) + "@" + host + ":" + port
print("Internal test = " + connectstring)
return connectstring.encode('iso-8859-1')
# Connection to MongoDB
def connectToMongoDb():
# The f-string is only available in Python >= 3.6
params = dbConfig('mongodb')
print("Parameters : " + params)
mongoClient = MongoClient(params)
try:
# print("Connection to database")
dbco = mongoClient.mongollection
print("Here")
print("Test dbco : " + dbco)
print("Connected to MongoDB !")
return dbco
except:
return "Error : can't connect to MongoDB !"
# Close MongoDB connection
def closeMongoDbConnection():
# try:
mongoClient.close()
return 'Connection closed'
# except:
# return "Can't close the connection. See if you already had one or if you didn't mispell its name."
# Make a query in MongoDB
def mongoDbQuery():
#mongocursor = mongoClient.mongollection.find()
#for document in cursor:
#print(document)
mongoClient.database_names()
if __name__ == '__main__':
dataconnect = connectToMongoDb()
print("Connection\n")
#mongoDbQuery()
#collec = mongoClient.measure
user_info = dbco.find({})
print(user_info)
print(closeMongoDbConnection())
Could you help me with this problem ? 您能帮我解决这个问题吗? I think quote_plus() or even dbco = mongoClient.mongollection is what makes this error occurs. 我认为quote_plus()甚至dbco = mongoClient.mongollection是导致此错误发生的原因。 But I'm not 100% sure and I don't see, even with the documentation, how could I resolve this. 但是我不确定100%,即使有文档,我也看不到如何解决此问题。
Thank you. 谢谢。
I'm reading your code. 我正在阅读您的代码。 I see in the beginning of the program, you create the dbco
variable to point to an empty string: 我在程序的开头看到,您创建了dbco
变量以指向一个空字符串:
dbco = ''
following after that, I see you define a couple functions, then you call find()
on that string: 之后,我看到您定义了几个函数,然后在该字符串上调用find()
:
user_info = dbco.find({})
You're passing {}
(empty dict) as parameter to the method... but as you can see in the documentation here , this method needs another string as first parameter. 您正在将{}
(空dict)作为参数传递给方法...但是如您在此处的文档中所见,此方法需要另一个字符串作为第一个参数。 That causes the error you see. 这会导致您看到错误。
Now I'm not entirely sure how to fix it because I don't know what you mean. 现在,我不完全确定如何解决它,因为我不知道您的意思。 Maybe you mean to use the dataconnect
variable, since that is the one that gets the results of the connectToMongoDb
function: 也许您的意思是使用dataconnect
变量,因为那是获取connectToMongoDb
函数结果的变量:
dataconnect = connectToMongoDb()
I made it again and changed some little things. 我又做了一次,改变了一些小东西。 Now, it works. 现在,它可以工作了。 Here is the code, for people who'd need it in the future. 这是代码,供将来需要的人使用。
import sys
import pymongo
from urllib import quote_plus
from pymongo import MongoClient
from configparser import ConfigParser
client = MongoClient()
connected = ''
# Retrieve connection information from ini file
def dbConfig(section, filename='database.ini'):
# Keep result in global variable when the function is finished
global client
# Create a parser
parser = ConfigParser()
# Read config file
parser.read(filename)
# Get section, depending on the database engine
db = {}
if parser.has_section(section):
params = parser.items(section)
for param in params:
db[param[0]] = param[1]
else:
raise Exception('Section {0} not found in the {1} file'.format(section, filename))
# Return data or directly as a string
if section == 'postgresql':
return db
elif section == 'mongodb':
# Variables for the connection
host = ''
username = ''
passwd = ''
port = ''
connectstring = ''
# Make a string to connect to MongoDB
for key, value in db.iteritems():
if key == 'hostname':
host = value.encode("utf-8")
elif key == 'username':
username = value
elif key == 'password':
passwd = value
elif key == 'database':
dbmongo = value
elif key == 'collection':
mongollection = value
elif key == 'port':
port = value
# Make the URI needed for the connection to Mongo DB
passwing = "mongodb://" + username + ":" + quote_plus(passwd) + "@" + host + ":" + port
client = MongoClient(passwing)
return client
# Close MongoDB connection
def closeMongoDbConnection():
# Try to close the connection to Mongo DB
try:
client.close()
return 'Connection closed'
except:
return "Can't close the connection. See if you already had one or if you didn't mispell its name."
# Connection to MongoDB
def connectToMongoDb(mydb):
db = client.get_database(mydb)
return db.measure
# Make a query in MongoDB
def mongoDbQuery():
docs = connected.find().count()
#for document in docs:
#print(document)
print(docs)
if __name__ == '__main__':
connected = connectToMongoDb('neocampus')
#docs = connected.find()
# print(test)
#for document in docs:
#print(document)
mongoDbQuery()
# Show if the connection to Mongo DB is a success or not
print(closeMongoDbConnection())
The problems were : - about global variables in and out of functions - the database variable empty (because of that) - a first call of MongoClient() 问题是:-关于函数中的全局变量和函数外的信息-数据库变量为空(因此)-首次调用MongoClient()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.