【问题标题】:Flask-Sqlalchemy, Primary key for secondary table in many-to-many relationshipFlask-Sqlalchemy,多对多关系中辅助表的主键
【发布时间】:2015-08-01 03:39:06
【问题描述】:

我正在尝试使用 Flask-Sqlalchemy 为 Postgresql 数据库建立简单的多对多关系:

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)

如果我尝试将书籍附加到作者的书籍列表中:

u = User.query.get(user_id)
b = Book.query.get(book_id)
u.books.append(b)

所以我遇到了这个错误:

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

有没有办法配置模型自动设置关联表中的主键?

【问题讨论】:

  • 你为什么有authors_books.id
  • 我们无法更改旧数据库

标签: python postgresql flask sqlalchemy many-to-many


【解决方案1】:

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')),
)

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 2015-05-03
    • 2021-11-23
    • 2016-06-15
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多