【问题标题】:SQL syntax error in Peewee example with primary key带有主键的 Peewee 示例中的 SQL 语法错误
【发布时间】:2015-02-17 23:58:48
【问题描述】:

我在quickstart tutorial 之后有一个简单的 Peewee 数据库模型,我正在尝试向数据库添加一个实例。它返回错误,

'你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 \'WHERE (image.url = \'foo\')\' 附近使用正确的语法

我尽可能地将代码配对,但我找不到我的错误。这是我的最小且可重现的模型(我希望它可以在我的机器上重现)示例。编辑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)

【问题讨论】:

  • 如果有人可以确认这是可重现的,那也会有所帮助。
  • @philipxy 这是我的示例中的疏忽。我将添加此调用和更多详细信息,但我仍然收到错误消息。

标签: python mysql syntax-error primary-key peewee


【解决方案1】:

这可能会对您有所帮助:

https://peewee.readthedocs.org/en/2.0.2/peewee/fields.html#non-integer-primary-keys

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 是自动生成的 当您将新行插入数据库时​​为您服务。小便的方式 确定是否执行 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()

【讨论】:

  • 如果我不知道我的实例是否已经存在于数据库中怎么办?在进行强制插入之前是否需要提前检查?
  • 老实说我不知道​​,我会尝试强制插入并查看它的行为
  • 对数据库中已有的实例执行强制插入会导致错误。我会写一个关于这个的后续问题。
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 2018-05-27
  • 2014-08-17
  • 2017-07-03
  • 1970-01-01
  • 2016-01-19
  • 2016-03-10
  • 2017-12-22
相关资源
最近更新 更多