(sqlite3.Ошибка ограничения IntegrityError) NOT NULL: surfers.id

#python #sqlalchemy

Вопрос:

Я получаю

 "(sqlite3.IntegrityError) NOT NULL constraint failed: surfers.id
[SQL: INSERT INTO surfers (name, hometown, wipeouts, rank) VALUES (?, ?, ?, ?)]
[parameters: ('Bruno', 'Chicago', 20, 10)]"
 

ошибка при попытке зафиксировать некоторые таблицы в sqlalchemy. Мне трудно понять, почему именно. Я также пытался включить итерацию при создании самих классов, но это тоже не сработало. Может кто-нибудь, пожалуйста, помочь мне выяснить, как это решить? Подробности ниже:

 # Import SQL Alchemy
from sqlalchemy import create_engine

# Import and establish Base for which classes will be 
constructed 
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

# Import modules to declare columns and column data types
from sqlalchemy import Table, ForeignKey, Column, Integer, String, Float

# Create Surfer and Board classes
# ----------------------------------

class Surfer(Base):
    __tablename__ = 'surfers'
    __table_args__ = {'extend_existing': True}
    surfer_id = Column(Integer, primary_key = True)
    name = Column(String(255))
    hometown = Column(String(255))
    wipeouts = Column(Integer)
    rank = Column(Integer)

class Board(Base):
    __tablename__ = 'surfboards'
    __table_args__ = {'extend_existing': True}
    id = Column(Integer, primary_key = True)
    surfer_id = Column(Integer, ForeignKey('surfers.surfer_id'))
    board_name = Column(String(255))
    color = Column(String(255))
    length = Column(Integer)

# Create specific instances of the Surfer and Board classes
# ----------------------------------
# Create a new surfer named "Bruno"
# Create a new board and associate it with a surfer's ID

Bruno = Surfer(name = 'Bruno', hometown = 'Chicago', wipeouts = 20, rank = 10)

new_board = Board(surfer_id = Bruno.surfer_id, board_name = 'yuh', color = 'purple', length =8)

# Create Database Connection
# ----------------------------------
# Establish Connection to a sqlite database

engine = create_engine("sqlite:///surfer.sqlite")
conn = engine.connect()
Base.metadata.create_all(conn)
from sqlalchemy.orm import Session
session = Session(bind=engine)

# To push the objects made and query the server we use a Session 
object
session.add(Bruno)
session.add(new_board)
session.commit()
 

Комментарии:

1. Я могу запустить этот код, и я вижу, что одна строка вставлена в surfers таблицу, а одна строка вставлена в surfboards таблицу

2. Хм, хорошо, что он работает нормально, но я удивляюсь, почему он не будет делать то же самое на моей машине.

3. Почему у вас есть __table_args__ = {'extend_existing': True} ?

4. Я исходил из предположения, что включение расширения позволит мне перезаписывать таблицы без необходимости перезапуска ядра в записной книжке jupyter. Пожалуйста, поправьте меня, если я ошибаюсь.