peewee如何处理自动创建主键?

时间:2018-05-08 12:34:10

标签: python-3.x peewee

我正在尝试弄清楚peewee在创建未指定id列的表时如何处理主键的创建。我的目标是通过SQL Relay为SQL Server编写数据库连接器,但我认为这个问题可能更适用于那些试图理解peewee如何工作的人。

SchemaManager对象中,有一个名为_create_table的方法可以处理表的创建。

def _create_table(self, safe=True, **options):
    is_temp = options.pop('temporary', False)
    ctx = self._create_context()
    ctx.literal('CREATE TEMPORARY TABLE ' if is_temp else 'CREATE TABLE ')
    if safe:
        ctx.literal('IF NOT EXISTS ')
    ctx.sql(self.model).literal(' ')

    columns = []
    constraints = []
    meta = self.model._meta
    if meta.composite_key:
        pk_columns = [meta.fields[field_name].column
                      for field_name in meta.primary_key.field_names]
        constraints.append(NodeList((SQL('PRIMARY KEY'),
                                     EnclosedNodeList(pk_columns))))

    for field in meta.sorted_fields:
        columns.append(field.ddl(ctx))
        if isinstance(field, ForeignKeyField) and not field.deferred:
            constraints.append(field.foreign_key_constraint())

    if meta.constraints:
        constraints.extend(meta.constraints)

    constraints.extend(self._create_table_option_sql(options))
    ctx.sql(EnclosedNodeList(columns + constraints))

    if meta.without_rowid:
        ctx.literal(' WITHOUT ROWID')
    return ctx

我在那里看到了复合键创建代码,但我不明白如何添加简单的主键。

我在工作中遇到的主要问题是创建的主键没有IDENTITY属性(这并不奇怪,因为peewee不支持SQL Server)。因此,如果没有IDENTITY属性,则无法使用Model.create()在数据库中创建模型对象。

对此有任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

我有一个针对此问题的解决方法,即使用IntegerField(primary_key=True)向模型添加非自动递增主键。然后我在创建新对象时使用Model.save(force_insert=True)来插入而不是更新。