#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. Пожалуйста, поправьте меня, если я ошибаюсь.