我正在尝试弄清楚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()
在数据库中创建模型对象。
对此有任何帮助表示赞赏!
答案 0 :(得分:0)
我有一个针对此问题的解决方法,即使用IntegerField(primary_key=True)
向模型添加非自动递增主键。然后我在创建新对象时使用Model.save(force_insert=True)
来插入而不是更新。