ここでFlask-SQLAlchemyで多対多の関係を作成しようとしていますが、多くの識別子に "を埋める方法がわからないようですデータベース」。私が間違っていることと、それがどのように見えるかを理解してもらえますか?
class User(db.Model):
__table= 'users'
user_id = db.Column(db.Integer, primary_key=True)
user_fistName = db.Column(db.String(64))
user_lastName = db.Column(db.String(64))
user_email = db.Column(db.String(128), unique=True)
class Class(db.Model):
__table= 'classes'
class_id = db.Column(db.Integer, primary_key=True)
class_name = db.Column(db.String(128), unique=True)
そして、私の識別子データベース:
student_identifier = db.Table('student_identifier',
db.Column('class_id', db.Integer, db.ForeignKey('classes.class_id')),
db.Column('user_id', db.Integer, db.ForeignKey('users.user_id'))
)
これまでのところ、データベースにデータを挿入しようとすると、このように見えます。
# User
user1 = User(
user_fistName='John',
user_lastName='Doe',
user_email='[email protected]')
user2 = User(
user_fistName='Jack',
user_lastName='Doe',
user_email='[email protected]')
user3 = User(
user_fistName='Jane',
user_lastName='Doe',
user_email='[email protected]')
db.session.add_all([user1, user2, user3])
db.session.commit()
# Class
cl1 = Class(class_name='0A')
cl2 = Class(class_name='0B')
cl3 = Class(class_name='0C')
cl4 = Class(class_name='Math')
cl5 = Class(class_name='Spanish')
db.session.add_all([cl1, cl2, cl3, cl4, cl5])
db.session.commit()
私の問題は、「student_identifier」オブジェクトを実際に作成できないので、多対多のデータベースにどのように追加するのですか?できれば、次のようになります。
# Student Identifier
sti1 = StiClass(class_id=cl1.class_id, class_name=user1.user_id)
sti2 = StiClass(class_id=cl3.class_id, class_name=user1.user_id)
sti3 = StiClass(class_id=cl4.class_id, class_name=user1.user_id)
sti4 = StiClass(class_id=cl2.class_id, class_name=user2.user_id)
db.session.add_all([sti1, sti2, sti3, sti4])
db.session.commit()
ORMを使用して多対多のテーブルに挿入する方法を教えてください。
関連付けテーブルに何かを直接追加する必要はありません。SQLAlchemyがそれを行います。これは多かれ少なかれ SQLAlchemyのドキュメント からです。
association_table = db.Table('association', db.Model.metadata,
db.Column('left_id', db.Integer, db.ForeignKey('left.id')),
db.Column('right_id', db.Integer, db.ForeignKey('right.id'))
)
class Parent(db.Model):
__table= 'left'
id = db.Column(db.Integer, primary_key=True)
children = db.relationship("Child",
secondary=association_table)
class Child(db.Model):
__table= 'right'
id = db.Column(db.Integer, primary_key=True)
p = Parent()
c = Child()
p.children.append(c)
db.session.add(p)
db.session.commit()
したがって、サンプルは次のようになります。
student_identifier = db.Table('student_identifier',
db.Column('class_id', db.Integer, db.ForeignKey('classes.class_id')),
db.Column('user_id', db.Integer, db.ForeignKey('students.user_id'))
)
class Student(db.Model):
__table= 'students'
user_id = db.Column(db.Integer, primary_key=True)
user_fistName = db.Column(db.String(64))
user_lastName = db.Column(db.String(64))
user_email = db.Column(db.String(128), unique=True)
class Class(db.Model):
__table= 'classes'
class_id = db.Column(db.Integer, primary_key=True)
class_name = db.Column(db.String(128), unique=True)
students = db.relationship("Student",
secondary=student_identifier)
s = Student()
c = Class()
c.students.append(s)
db.session.add(c)
db.session.commit()
まず、student_identifier
はデータベースではなくSQLAlchemyリフレクションテーブルとして定義されます。
通常、モデルとリフレクションテーブルオブジェクトの間にすべてのリレーションシップが適切に設定されている場合、リレーションテーブルにデータを挿入するために、リレーションテーブルにモデルオブジェクトを追加するだけで(リレーションシップリストにモデルオブジェクトを追加する)、たとえば、上記のmehdi-sadeghi。
ただし、リレーションシップをセットアップしない場合は、実際にリフレクションテーブルに直接挿入する方法があります。例えば:
statement = student_identifier.insert().values(class_id=cl1.id, user_id=sti1.id)
db.session.execute(statement)
db.session.commit()
その後、多対多のリレーションシップ行がstudent_identifier
リフレクションテーブルに挿入されたことを確認できるはずです。トランザクションで行われているように、各SQLステートメントを実行した後にコミットすることを忘れないでください。
これが代替的なアプローチに役立つことを願っています。