【问题标题】:Proper way to make changes to already created sqlite database with Pony ORM使用 Pony ORM 更改已创建的 sqlite 数据库的正确方法
【发布时间】:2016-12-28 11:10:41
【问题描述】:

我可能在问一个明显的问题,但我找不到答案。 我正在学习 Pony ORM,并从文档中创建简单的数据库开始。我设计了一个简单的数据库图和代码https://editor.ponyorm.com/user/nidza11/Ponz# 

from pony.orm import *

db = Database()

class Person(db.Entity):
    id = PrimaryKey(int, auto=True)
    name = Required(str)
    age = Required(int)
    cars = Set('Car', cascade_delete=True)

class Car(db.Entity):
    id = PrimaryKey(int, auto=True)
    make = Required(str)
    model = Required(str)
    person = Required(Person)

db.bind("sqlite", "TestDB.sqlite", create_db = True)
db.generate_mapping(create_tables=True)

with db_session:
    p1 = Person(name="John", age=24)
    p2 = Person(name="Ive", age=26)
    p3 = Person(name="Olivia", age = 26)
    c1 = Car(make="Toyota", model = "Prius", person = p2)
    p3 = Car(make="Ford", model = "Explorer", person = p3)

运行代码后,创建并填充了数据库。 我想让 Person 表中的 name 属性唯一。所以我对代码进行了更改 name = Required(str, unique=True) 再次运行代码后,数据库已填充,但名称字段未设置为唯一。数据被复制。根据数据库浏览器名称字段是“唯一的”。我预计会出错。这样的错误将帮助我保持实体和数据库同步。

只在 Person 表类中添加新属性,而不是在数据库中,会导致错误。

是否可以只在代码中的一个地方进行更改,这也会反映在数据库中?

如果我必须在两个地方进行相同的更改,如何做到又好又干净?

【问题讨论】:

    标签: python sqlite orm ponyorm


    【解决方案1】:

    我刚刚在 Pony ORM 'Telegram' 组上询问过,这就是那里发生的交易。

    【讨论】:

    • 我发现当 db.generate_mapping 在已创建的数据库上执行时,它正在执行一些字段和表是否存在的检查。 'SELECT "Person"."id", "Person"."name", "Person"."age", "Person"."comment" FROM "Person" "Person" WHERE 0 = 1' 我应该选择一些东西类似,这将比较属性属性。
    • Pony 中的迁移似乎已接近尾声,并将与 0.8 版本一起提供,请参阅GitHub issue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2011-01-02
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多