3

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?

1
  • copy_database is the right way to do it. Are you sure that command was successful and you copied right database? Commented Sep 5, 2013 at 22:01

3 Answers 3

5

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')
Sign up to request clarification or add additional context in comments.

Comments

2
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')

2 Comments

I tried this. It even answered True. But when I do for e in client.old_name.twigs.find(): print(e), I see a bunch of things. But when I do for e in client.new_name.twigs.find(): print(e), it prints nothing. Which makes me think it didn't really deep copy?
I can't spell my own database names. Sigh. Dang. Sorry. (Interpret, it did work)
0

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")

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.