SQLAlchemy, clear database content but don't drop the schema

后端 未结 3 1572
梦毁少年i
梦毁少年i 2020-12-13 00:01

I\'m developing a Pylons app which is based on exisitng database, so I\'m using reflection. I have an SQL file with the schema that I used to create my test database. That\'

相关标签:
3条回答
  • 2020-12-13 00:08

    For PostgreSQL using TRUNCATE:

    with contextlib.closing(engine.connect()) as con:
        trans = con.begin()
        con.execute('TRUNCATE {} RESTART IDENTITY;'.format(
            ','.join(table.name 
                     for table in reversed(Base.metadata.sorted_tables))))
        trans.commit()
    

    Note: RESTART IDENTITY; ensures that all sequences are reset as well. However, this is slower than the DELETE recipe by @aknuds1 by 50%.

    Another recipe is to drop all tables first and then recreate them. This is slower by another 50%:

    Base.metadata.drop_all(bind=engine)
    Base.metadata.create_all(bind=engine)
    
    0 讨论(0)
  • 2020-12-13 00:11

    I asked about the same thing on the SQLAlchemy Google group, and I got a recipe that appears to work well (all my tables are emptied). See the thread for reference.

    My code (excerpt) looks like this:

    import contextlib
    from sqlalchemy import MetaData
    
    meta = MetaData()
    
    with contextlib.closing(engine.connect()) as con:
        trans = con.begin()
        for table in reversed(meta.sorted_tables):
            con.execute(table.delete())
        trans.commit()
    

    Edit: I modified the code to delete tables in reverse order; supposedly this should ensure that children are deleted before parents.

    0 讨论(0)
  • 2020-12-13 00:18

    How about using truncate:

    TRUNCATE [ TABLE ] name [, ...]

    (http://www.postgresql.org/docs/8.4/static/sql-truncate.html)

    This will delete all the records in the table, but leave the schema in tact.

    0 讨论(0)
提交回复
热议问题