首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Peewee、MySQL和INSERT忽略

Peewee、MySQL和INSERT忽略
EN

Stack Overflow用户
提问于 2017-01-24 21:31:48
回答 1查看 1.7K关注 0票数 1

我在一个带有MySQL DB的小Python脚本中使用Peewee作为ORM。

代码语言:javascript
复制
#!/usr/bin/python3
#coding: utf-8

import peewee
from peewee import *

db = MySQLDatabase(**config)
class Foo(peewee.Model):
    bar = peewee.CharField(unique=True, null=False)
    class Meta:
        database = db

try:
    Foo.create_table()
except:
    pass

foo_data = [{'bar':'xyz'},{'bar':'xyz'}]
Foo.insert_many(foo_data).on_conflict(action='IGNORE').execute()

如你所见,我有同样的钥匙。我想使用on_conflict方法第二次忽略它(described in the API reference,但仅适用于SQLite3),但在运行脚本时出现以下错误(正常,因为不是为MySQL实现的):

代码语言:javascript
复制
peewee.ProgrammingError: (1064, "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 'OR IGNORE INTO `foo` (`bar`) VA' at line 1")

如果我删除这个键,MySQL也不喜欢它(重复的键)。如何让peewee插入一个新的密钥,或者如果它是一个重复的密钥,则忽略它?

EN

回答 1

Stack Overflow用户

发布于 2017-01-27 23:31:04

使用db.__str__()。它返回

代码语言:javascript
复制
<peewee.MySQLDatabase object at 0x7f4d6a996198>

如果连接数据库为MySQL,并且

代码语言:javascript
复制
<peewee.SqliteDatabase object at 0x7fd0f4524198>

如果连接数据库是Sqlite。

因此,您可以使用如下的if语句:

代码语言:javascript
复制
if 'SqliteDatabase' in db.__str__():
    Foo.insert_many(foo_data).on_conflict(action='IGNORE').execute()
elif 'MySQLDatabase' in db.__str__():
    try:
        Foo.insert_many(foo_data).execute() # or whatever you want with MySQL
    except:
        pass

我认为对于MySQL数据库,您可以这样做:

代码语言:javascript
复制
for data in foo_data:
    for k,v in data.items():
        if (Foo.select(Foo.bar).where(Foo.bar == v).count()) == 0:
            Foo.insert(bar=v).execute()

因此,这可以是:

代码语言:javascript
复制
if 'SqliteDatabase' in db.__str__():
    Foo.insert_many(foo_data).on_conflict(action='IGNORE').execute()
elif 'MySQLDatabase' in db.__str__():
    with db.atomic():
        for data in foo_data:
            for k, v in data.items():
                if (Foo.select(Foo.bar).where(Foo.bar == v).count()) == 0:
                    Foo.insert(bar=v).execute()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41829548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档