首页 > 解决方案 > 如何使用 peewee 将现有数据插入 sqlite 数据库

问题描述

所以我正在研究用 peewee 创建一个 sqlite 体育数据库,我试图弄清楚如何将数据插入到已经为某些表插入的数据库中。

例如,我的这段代码在第一次循环时运行良好,但在第二次循环时抛出 IntegrityError,因为已经定义了竞技场“mackey”。

我该如何编写它,以便它在第二次运行循环时识别出“印第安纳州西拉斐特”中的“Mackey Arena”已经创建,并使用该场地_id,而不是创建第二个场地行?

from peewee import *

db = SqliteDatabase('pndb.db')

class Venue(Model):
    Name = CharField(unique = True)
    City = CharField()
    State = CharField()

    class Meta:
        database = db


class Team(Model):
    Name = CharField(unique = True)

    class Meta:
        database = db

class Game(Model):

    DateTime = DateTimeField()
    NeutralSite = BooleanField()
    ConferenceMatchup = BooleanField()
    venue = ForeignKeyField(Venue)
    Attendance = IntegerField()
    Status = CharField()

    class Meta:
        database = db

class TeamGame(Model):

    game = ForeignKeyField(Game)
    team = ForeignKeyField(Team)
    HomeAway = CharField()

    class Meta:
        database = db 





db.connect()
db.create_tables([Game,Venue,TeamGame,Team])

from datetime import date

for i in range(1,5):

    mackey = Venue.create(Name = 'Mackey Arena',City = 'West Lafayette',State = 'Indiana')

    purdue = Team.create(Name = 'Purdue')

    pGame = Game.create(DateTime = date(2019,i,2),NeutralSite = False, ConferenceMatchup = True, venue = mackey,Attendance = 3000,Status = 'completed')

    tG = TeamGame.create(game = pGame,team = purdue, HomeAway = 'Home')

    tG.save()

标签: pythonsqlsqlitepeewee

解决方案


有很多方法,这取决于您如何导入数据。dict您可以使用or或其他方式跟踪您在内存中插入的对象set,如果您一次加载所有内容并且可能存在重复,则该方法有效。

或者,您可以捕获peewee.IntegrityError违反 db 约束时引发的错误。例如:

try:
    # Create new user. Assume a UNIQUE constraint on username.
    user = User.create(username=username)
except IntegrityError:
    # Already exists, grab from db.
    user = User.get(User.username == username)

但是,这可能效率低下,因为如果您预计会有很多重复项,您可能会执行两个查询。要解决这个问题,您可以尝试结合我描述的两种方法。


推荐阅读