Travis Griggs
Travis Griggs

Reputation: 22252

How to rename a mongodb database using pymongo?

I need to rename a database I created using pymongo. I'd like to use pymongo to do it. I found this other stackoverflow question that is very similar, and the code snippets look pythonesque, except the use keyword which makes it... I don't know what (Update: Perl probably?).

I did a

client.copy_database('old_name', 'new_name)

And found that I then had new_name in `client.database_names()'. But it appears to have no collections in it? What else do I need to do, to deeply copy the database, using pymongo commands?

Upvotes: 3

Views: 2977

Answers (3)

Salomon Bizimana
Salomon Bizimana

Reputation: 1

I tried all above ways but none worked for me, The script below has worked for me and thought it would work for you as well.(Note: con is my database connection )

def rename_database(old_name,new_name):
        #copying collections and documents from old to new database
        for i in con[old_name].list_collection_names():
            con[new_name][i]
            for j in con[old_name][i].find():
                a=con[new_name][i].insert_one(j)
        #dropping old database
        con.drop_database(old_name)

#testing purpose
rename_database("test","newDbName")

Upvotes: 0

user2804197
user2804197

Reputation: 402

From PyMongo 3.0 onwards, you have to use admin.command since copy_database was removed in 3.0:

client.admin.command('copydb',
                     fromdb='source_db_name',
                     todb='target_db_name')

Upvotes: 5

zero323
zero323

Reputation: 330083

import pymongo
client = pymongo.MongoClient()

client.copy_database('foo', 'bar')

assert set(client['foo'].collection_names()) == set(client['bar'].collection_names())

for collection in client['foo'].collection_names():
    assert client['foo'][collection].count() == client['bar'][collection].count()

client.drop_database('foo')

Upvotes: 2

Related Questions