Peewee示例中主键出现SQL语法错误

3

我有一个简单的Peewee数据库模型,按照快速入门教程创建,并尝试将实例添加到数据库中。但是却返回以下错误:

'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'WHERE (image.url = \'foo\')\' at line 1'

我已经尽可能地精简了代码,但是我无法找出错误所在。这是我最小化且可重现(我希望能在我的计算机上重现)的示例代码。请根据您的设置编辑MySQLDatabase调用。 我从一个名为'test'的空数据库开始。

from peewee import *

database = MySQLDatabase('test', **{'password': '1234', 'user': 'root'})

class BaseModel(Model):
    class Meta:
        database = database

class Image(BaseModel):
    url = CharField(primary_key=True)

database.connect()
database.create_tables([Image])

image_url = 'foo'
image_entry = Image(url=image_url)
image_entry.save()

这个错误是由示例代码的最后一行抛出的。如果我查看我的数据库,我可以看到表“image”已成功创建。

describe image;

返回值

+-------+--------------+------+-----+---------+-------+  
| Field | Type         | Null | Key | Default | Extra |  
+-------+--------------+------+-----+---------+-------+  
| url   | varchar(255) | NO   | PRI | NULL    |       |  
+-------+--------------+------+-----+---------+-------+  

表格仍然为空,因为错误出现在保存语句期间。
select * from image:

返回值

Empty set(0.00 sec)

如果有人能够确认这是可重现的,那也会很有帮助。 - Cecilia
@philipxy 这是我示例中的一个疏忽。我会添加这个调用和更多细节,但我仍然收到错误提示。 - Cecilia
1个回答

3
这可能会对你有帮助: https://peewee.readthedocs.org/en/2.0.2/peewee/fields.html#non-integer-primary-keys (注:该网页解释了如何使用Peewee库创建非整数主键。)
from peewee import Model, PrimaryKeyField, VarCharColumn

class UUIDModel(Model):
    # explicitly declare a primary key field, and specify the class to use
    id = CharField(primary_key=True)

自增ID是在向数据库插入新行时自动生成的。Peewee确定是执行INSERT还是UPDATE的方式取决于检查主键值是否为None。如果为None,则执行INSERT,否则对现有值执行UPDATE。由于在我们的uuid示例中,数据库驱动程序不会生成新的ID,因此我们需要手动指定它。当我们第一次调用save()方法时,需要传递force_insert=True参数。
inst = UUIDModel(id=str(uuid.uuid4()))
inst.save() # <-- WRONG!!  this will try to do an update

inst.save(force_insert=True) # <-- CORRECT

# to update the instance after it has been saved once
inst.save()

如果我不知道我的实例是否已经存在于数据库中,该怎么办?在进行强制插入之前,我需要提前检查吗? - Cecilia
老实说我不知道,我会尝试强制插入并观察其行为。 - Phate01
在数据库中对已经存在的实例进行强制插入会导致错误。我将写一个后续问题来解决这个问题。 - Cecilia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接