我正面临着 Peewee 的奇怪行为。
对于我的模型(数据库 PostgreSQL):
class Car(BaseTable):
id = UUIDField(primary_key=True, unique=True, default=uuid4)
user = ForeignKeyField(SocialUser)
vendor = CharField(max_length=30)
model = CharField(max_length=30)
colour = CharField(max_length=30)
number = CharField(max_length=30)
registered_date = DateTimeField(default=datetime.datetime.now)
我正在尝试以这种方式更新一些字段:
with database.atomic():
car, created = Car.get_or_create(user=record['user'],
number=record['number'],
defaults={'vendor': record['vendor'],
'model': record['model'],
'colour': record['colour']
})
if not created:
print(car.vendor, type(car.vendor), len(car.vendor))
print(record['vendor'], type(record['vendor']), len(record['vendor']))
car.vendor = record['vendor'],
car.model = record['model'],
car.colour = record['colour']
print('-------------------------------')
print(type(car.vendor), len(car.vendor))
print(type(record['vendor']), len(record['vendor']))
car.save()
对于这些论点:
record['user'] = '3dba2da7-f005-4806-888c-167669a984b0'
record['number'] = 'е123кх777rus'
record['vendor'] = 'Hyundai'
record['model'] = 'Creta'
record['colour'] = 'Green'
控制台结果:
Hyundai <class 'str'> 7
Hyundai <class 'str'> 7
-------------------------------
('Hyundai',) <class 'tuple'> 1
Hyundai <class 'str'> 7
数据库结果:
id | user_id | vendor | model | colour | number | registered_date
28dfdfe6-2230-4d90-94f5-27b2946e8dc6 | 3dba2da7-f005-4806-888c-167669a984b0 | ('Hyndai',) | ('Creta',) | Green | е123кх777rus | 2021-06-15 09:58:06.583585
但是,如果我使用这种方式:
with database.atomic():
car, created = Car.get_or_create(user=record['user'],
number=record['number'],
defaults={'vendor': record['vendor'],
'model': record['model'],
'colour': record['colour']
})
if not created:
Car.update(vendor=record['vendor'],
model=record['model'],
colour=record['colour'])\
.where(Car.id == car.id)\
.execute()
这工作正常,实例和数据库中没有元组。
你能解释一下为什么吗?
行尾的逗号与赋值运算符
car.vendor = 记录['供应商'],
car.model = 记录['型号'],
使这些表达式实际上成为元组:
>>> some_variable = "some_string",
>>> type(some_variable)
<class 'tuple'>
比较:
>>> some_variable = "some_string"
>>> type(some_variable)
<class 'str'>
注意db中的“color”没有问题
car.color = 记录['颜色']