在 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)
我正在使用 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)