1

申し訳ありませんが、これが初心者の質問ですが、多対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 のマッピングが正しいことを確認するために、データベースに入力するための最良の戦略は何ですか? モデルクラスが初期化される前に一意性を探すようにする必要がありますか?他のテーブルに関連付けてそれを行いますか?

4

2 に答える 2

2

最も簡単な解決策は、通貨の主キーとして通貨コードを使用し、価格の外部キーとして使用することです。その後、あなたが持つことができます

price.currency_id = "EUR"

これにより、データベース テーブルが読みやすくなります。たとえば、28342 ではなく「GBP」になります。

于 2013-08-02T17:56:08.117 に答える