Flask-Sqlalchemy,多对多关系中的辅助表的主键 [英] Flask-Sqlalchemy, Primary key for secondary table in many-to-many relationship
本文介绍了Flask-Sqlalchemy,多对多关系中的辅助表的主键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用Flask-Sqlalchemy for Postgresql数据库建立简单的多对多关系:
I am trying to build simple many-to-many relationship using Flask-Sqlalchemy for Postgresql Database:
from app import db
from sqlalchemy.dialects.postgresql import UUID
authors_books = db.Table(
'authors_books',
db.Column('id', UUID(as_uuid=True), primary_key=True),
db.Column('author_id', UUID(as_uuid=True), db.ForeignKey('authors.id')),
db.Column('book_id', UUID(as_uuid=True), db.ForeignKey('books.id')),
)
class Author(db.Model):
__tablename__ = 'authors'
# Fields
id = db.Column(UUID(as_uuid=True), primary_key=True)
first_name = db.Column(db.String)
last_name = db.Column(db.String)
# Relationships
books = db.relationship('Book',
secondary=authors_books,
backref=db.backref('authors', lazy='dynamic'))
class Book(db.Model):
__tablename__ = 'books'
id = db.Column(UUID(as_uuid=True), primary_key=True)
title = db.Column(db.String)
如果我尝试将书"追加到作者的书"列表中,则:
If i try to append Book to Author's books list:
u = User.query.get(user_id)
b = Book.query.get(book_id)
u.books.append(b)
所以我遇到了这个错误:
So i've got this error:
sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, "d5fb5e3f-2082-41f5-bcd2-bfdde11c78d4", "058fdbbd-d49f-4626-b669-b48dc4e75203").
[SQL: 'INSERT INTO authors_books (author_id, book_id) VALUES (%(author_id)s, %(book_id)s) RETURNING authors_books.id']
[parameters: {'author_id': UUID('d5fb5e3f-2082-41f5-bcd2-bfdde11c78d4'), 'book_id': UUID('058fdbbd-d49f-4626-b669-b48dc4e75203')}]
// Werkzeug Debugger
是否可以配置用于自动在关联表中设置主键的模型?
Is there way to configure models for setting primary key in association table automatically?
推荐答案
https: //groups.google.com/forum/#!topic/sqlalchemy/WAHaPIuzqZQ
authors_books = db.Table(
'authors_books',
db.Column('id', UUID(as_uuid=True), primary_key=True, default=lambda: uuid.uuid4().hex),
db.Column('author_id', UUID(as_uuid=True), db.ForeignKey('authors.id')),
db.Column('book_id', UUID(as_uuid=True), db.ForeignKey('books.id')),
)
这篇关于Flask-Sqlalchemy,多对多关系中的辅助表的主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文