Как вставить в базу данных sqlite с peewee с существующими данными - PullRequest
0 голосов
/ 19 февраля 2019

Итак, я собираюсь создать спортивную базу данных sqlite с помощью peewee и пытаюсь выяснить, как вставить в базу данных данные, которые уже были вставлены для определенных таблиц.

Например, у меня есть этот код, который отлично работает при первом запуске цикла, но выдает IntegrityError во втором цикле, поскольку арена "mackey" уже определена.

Как мне написать это так, чтобы во второй раз, когда он проходит через цикл, он распознал, что «Mackey Arena» в «Уэст-Лафайет, Индиана» уже был создан, и использует этот venue_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()

1 Ответ

0 голосов
/ 19 февраля 2019

Есть много способов, и это зависит от того, как вы импортируете свои данные.Вы можете отслеживать объекты, которые вы вставили в память, используя dict или set или что-то еще, что работает, если вы загружаете вещи сразу и могут быть дубликаты.

Кроме того, вы можете поймать ошибку peewee.IntegrityError, которая возникает при нарушении ограничения в БД.Например:

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)

Однако это может быть неэффективно, поскольку вы потенциально делаете два запроса, если ожидаете много дубликатов.Чтобы обойти это, вы можете попытаться объединить два подхода, которые я описал.

...