申し訳ありませんが、これが初心者の質問ですが、多対1の関係に関するドキュメントがこれをカバーしていないようです。これに似たものを探していました(「テーブルにデータを挿入/追加する方法」セクションの下) が、示されている例では、これは常に一意の挿入です。
基本的に、ローカル マシンにあるデータをデータベースに入力したいと考えています。簡単にするために、以下に示す例を、問題を説明するMWEに構成しました。Price
問題はandと呼ばれる 2 つのテーブルで構成されCurrency
、実装は宣言型スタイルで行われます。
model.py
from sqlalchemy import Column, Integer, String
from sqlalchemy import Float, BigInteger, ForeignKey
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Currency(Base):
__tablename__ = 'Currency'
id = Column(Integer, primary_key=True)
unit = Column(String(16), unique=True)
def __init__(self, unit):
self.unit = unit
class Price(Base):
__tablename__ = 'Price'
id = Column(BigInteger, primary_key=True)
currency_id = Column(Integer, ForeignKey("Currency.id"), nullable=False)
currency = relationship("Currency", backref="Currency.id")
hour1 = Column(Float)
hour2 = Column(Float)
def __init__(self, hour1, hour2):
self.hour1 = hour1
self.hour2 = hour2
現在、次のコードを使用してデータベースにデータを入力しています。
script.py
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from model import *
engine = create_engine('sqlite:///example.db', echo=True)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
session = db_session()
Base.metadata.create_all(engine)
oPrice = Price(2.5, 2.5)
oPrice.currency = Currency("EUR")
session.add(oPrice)
tPrice = Price(5.5, 1.5)
tPrice.currency = Currency("EUR")
session.add(tPrice)
session.commit()
これによりエラーが発生します
sqlalchemy.exc.IntegrityError: (IntegrityError) column unit is not unique u'INSERT INTO "Currency" (unit) VALUES (?)' ('EUR',)
Currency.id と Price.currency_id のマッピングが正しいことを確認するために、データベースに入力するための最良の戦略は何ですか? モデルクラスが初期化される前に一意性を探すようにする必要がありますか?他のテーブルに関連付けてそれを行いますか?