Flask sqlalchemy 다 대다 데이터 삽입
여기 Flask-SQLAlchemy 에서 다 대다 관계를 만들려고 하지만 "다 대다 식별자 데이터베이스" 를 채우는 방법을 모르는 것 같습니다 . 내가 뭘 잘못하고 있고 어떻게 보이는지 이해하도록 도와 주시겠습니까?
class User(db.Model):
__tablename__ = '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):
__tablename__ = '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='john@doe.es')
user2 = User(
user_fistName='Jack',
user_lastName='Doe',
user_email='jack@doe.es')
user3 = User(
user_fistName='Jane',
user_lastName='Doe',
user_email='jane@doe.es')
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):
__tablename__ = 'left'
id = db.Column(db.Integer, primary_key=True)
children = db.relationship("Child",
secondary=association_table)
class Child(db.Model):
__tablename__ = '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):
__tablename__ = '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):
__tablename__ = '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 반영 테이블로 정의됩니다.
일반적으로 모델과 리플렉션 테이블 개체 사이에 모든 관계를 올바르게 설정 한 경우 데이터를 리플렉션 테이블에 삽입하기 위해 (모델 개체를 관계 InstrumentList에 추가하여) 관련 모델 만 처리하면됩니다. 위에 제공된 mehdi-sadeghi.
그러나 관계를 설정하지 않으려면 실제로 리플렉션 테이블에 직접 삽입하는 방법이 있습니다. 예를 들면 :
statement = student_identifier.insert().values(class_id=cl1.id, user_id=sti1.id)
db.session.execute(statement)
db.session.commit()
After that, you should be able to see that a many-to-many relationship row is inserted into the student_identifier
reflection table. Don't forget to commit after you execute each SQL statement as it's done in a transaction.
Hope that helps you with an alternative approach.
참고URL : https://stackoverflow.com/questions/25668092/flask-sqlalchemy-many-to-many-insert-data
'Development Tip' 카테고리의 다른 글
ASCII "이미지"에서 "수직"정규식 일치 (0) | 2020.12.11 |
---|---|
Xcode 5/6 : View Debugging이 항상 회색으로 표시됩니까? (0) | 2020.12.11 |
오류 : detectMultiScale 함수의 (-215)! empty () (0) | 2020.12.11 |
Entity Framework Core를 사용하여 비동기 리포지토리를 모의하는 방법 (0) | 2020.12.11 |
JProfiler 또는 YourKit 중 더 나은 Java 프로파일 러는 무엇입니까? (0) | 2020.12.11 |