【问题标题】:How does it matter the schema defined using sqlalchemy, if Alembic has already defined the schema?如果 Alembic 已经定义了架构,那么使用 sqlalchemy 定义的架构有什么关系?
【发布时间】:2020-06-17 16:52:47
【问题描述】:

我正在使用 alembic 进行数据库迁移。并使用 sqlalchemy 连接到使用 python 的数据库。
在 alembic 中,我们将表模式定义为第一个版本,这是创建模式的实际版本。
例如,我在第一个版本的 alembic 中给出了这样的架构。

op.create_table(
        'my_table',
        sa.Column('id', sa.String(10), primary_key=True),
        sa.Column('mail', sa.String(20), unique=True)
)

现在,让我们进入 sqlalchemy 部分。在我的 python 项目中,我有一个数据库连接文件,我在其中创建了这样的用户表。

class CompanyInfo(Base):
    __tablename__ = 'my_table'

    id = Column(String(10), primary_key=False)
    name = Column(String(20), unique=False)

在这里,Alembic 是连接到数据库并创建表的第一件事。那么在我的python类中指定primary_key、唯一约束还是nullable=T/F值有什么关系呢?

我的问题只是关于数据类型和长度的约束。

【问题讨论】:

    标签: python mysql sqlalchemy alembic sqlalchemy-migrate


    【解决方案1】:

    首先,如果您不保持代码井井有条,那将是一团糟。在数据库和 sqlalchemy 模式中拥有不同的信息确实是个坏主意。

    一旦您开始使用 ORM,这些事情就变得非常重要。主键将用于标识内存中的对象。外键将用于自动对两个表进行查询。不确定是否独特。

    我认为 sqlalchemy 在查询相关表时会使用外键约束来创建连接。

    同样,我对可空处理不是绝对肯定,但我相信 sqlalchemy 在设置默认值时会使用它 - 如果可以为空,它可以在不知道默认值的情况下创建对象。

    【讨论】:

    • 我的意图不是违反结构。我只是想知道,当约束不匹配时,它将如何影响功能。
    【解决方案2】:

    这在序列化表数据和反序列化对象时很有用。

    例如,你想在表中插入数据,你可以简单地创建一个对象来检查这些属性,然后保存它。

    company_info = CompanyInfo(id=12,name='ABC')
    company_info.save()
    
    
    def save(self):
        self.add()
        self.commit()
    def commit(cls):
        db.session.commit()
    

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 2016-04-29
      • 1970-01-01
      相关资源
      最近更新 更多