我正在尝试为 Peewee 构建数据库驱动程序,但在获取save()
填充对象主键/ID 的方法时遇到了麻烦。这是一些示例代码:
from datetime import date
from peewee import BooleanField
from peewee import CharField
from peewee import DateField
from peewee import ForeignKeyField
from peewee import IntegerField
from peewee import Model
from SQLRelay import PySQLRDB
from sqlrelay_ext import SQLRelayDatabase
DB = SQLRelayDatabase('test2', host='<host>', user='<un>', password='<pwd>')
class BaseModel(Model):
class Meta:
database = DB
class Person(BaseModel):
name = CharField()
birthday = DateField()
is_relative = BooleanField()
class Pet(BaseModel):
owner = ForeignKeyField(Person, backref='pets')
name = CharField()
animal_type = CharField()
DB.connect()
Person.create_table(safe=False)
Pet.create_table(safe=False)
uncle_bob = Person(name='Bob', birthday=date(1960, 1, 15), is_relative=True)
uncle_bob.save() # bob is now stored in the database
print('Uncle Bob id: {}'.format(uncle_bob.id))
print('Uncle Bob _pk: {}'.format(uncle_bob._pk))
两者uncle_bob.id
都uncle_bob._pk
在None
之后.save()
。从深入研究peewee.py
代码来看,该_WriteQuery.execute()
方法似乎应该设置_pk
属性,但这并没有发生。我最好的猜测是游标实现没有正确运行。有没有人比这更有洞察力,可以帮助我找出这个问题?
谢谢!
编辑回答:
对于 SQL Server,以下代码允许您返回最后插入的 id:
def last_insert_id(self, cursor, query_type=None):
try:
cursor.execute('SELECT SCOPE_IDENTITY()')
result = cursor.fetchone()
return result[0]
except (IndexError, KeyError, TypeError):
pass