在 python 金字塔网络框架中,如何在播种前删除所有数据库 table 行?

In python pyramid web framework, how can I drop all db table rows before seeding?

我正在使用 cookiecutter 制作金字塔网络应用程序。 它具有在此处播种数据库的功能: https://github.com/Pylons/pyramid-cookiecutter-starter/blob/latest/%7B%7Bcookiecutter.repo_name%7D%7D/%7B%7Bcookiecutter.repo_name%7D%7D/sqlalchemy_scripts/initialize_db.py#L15

但是如果我 运行 它两次,或者更改我正在添加的条目,我会得到重复的条目和错误。我正在使用带有 sqlalchemy 的 sqlite 数据库。

我可以在 setup_models 中添加什么代码,以便在编写新模型实例之前删除所有数据库行? 如果这遍历所有模型并删除它们的所有实例,那就太好了。

def setup_models(dbsession):
    """
    Add or update models / fixtures in the database.
    """
    model = models.mymodel.MyModel(name='one', value=1)
    dbsession.add(model)

我正在通过 运行ning 更新数据库:

# to run the initial migration that adds the tables to the db, run this once
venv/bin/alembic -c development.ini upgrade head
# seed the data, I want to be able to keep editing the seed data
# and re-run this command and have it will wipe the db rows and insert the seed data defined in setup_models
venv/bin/initialize_suppah_db development.ini

默认情况下,SQLite 不会在引擎级别强制执行外键约束(即使您已经在 table DDL 中声明了它们),因此您可能只使用像[=11= 这样简单的东西]

insp = inspect(engine)
with engine.begin() as conn:
    for table_name in insp.get_table_names():
        conn.exec_driver_sql(f'DELETE FROM "{table_name}"')

可以通过以下方式做到这一点:

  • 遍历所有模型类
  • 使 类 的所有实例都被删除
  • 提交 session/transaction 删除它们
  • 然后播种数据 下面的代码就是这样做的:
import transaction
from ..models.meta import Base

def delete_table_rows(dbsession):
    model_clases = [cls for cls in Base.__subclasses__()]
    with transaction.manager as tx:
        for model_clases in model_clases:
            for instance in dbsession.query(model_clases).all():
                dbsession.delete(instance)
        transaction.commit()


def setup_models(dbsession):
    """
    Add or update models / fixtures in the database.

    """
    delete_table_rows(dbsession)
    # your custom seed code here
    model = models.mymodel.MyModel(name='one', value=1)
    dbsession.add(model)