我正在使用一個cookiecutter來制作一個金字塔網路應用。 它有一個功能,在這里為資料庫播種。 https://github.com/Pylons/pyramid-cookiecutter-starter/blob/latest/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/sqlalchemy_scripts/initialize_db.py#L15
但是如果我運行兩次,或者改變我正在添加的條目,我就會得到重復的條目和錯誤。我使用的是一個帶有 sqlchemy 的 sqlite 資料庫。
我可以在setup_models中添加什么代碼,以便在寫入新的模型實體之前洗掉所有資料庫的記錄? 如果這能在所有的模型上回圈并洗掉所有的實體,那就太好了。
def setup_models(dbsession)。
""
在資料庫中添加或更新模型/固定裝置。
""
model = models.mymodel.MyModel(name='one', value=1)
dbsession.add(model)
我正在通過運行以下程式更新資料庫:
# 運行初始遷移,將表添加到資料庫中,運行一次。
venv/bin/alembic -c development.ini upgrade head
# 種子資料,我希望能夠繼續編輯種子資料。
# 并重新運行此命令,它將擦除資料庫的行,并插入setup_models中定義的種子資料。
venv/bin/initialize_suppah_db development.ini
uj5u.com熱心網友回復:
默認情況下,SQLite不會在引擎級別強制執行外鍵約束(即使你已經在表的DDL中宣告了它們),所以你可能只需要使用簡單的東西,如
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}"')
uj5u.com熱心網友回復:
人們可以通過以下方式來實作:
我們可以通過以下方式實作:
我們可以通過以下方式實作
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)。
""
在資料庫中添加或更新模型/固定裝置。
""
delete_table_rows(dbsession)
# 您的自定義種子代碼在此。
model = models.mymodel.MyModel(name='one', value=1)
dbsession.add(model)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/332718.html
標籤:
