実現したいこと
- SQLAlchemyのリレーションでULIDを使う
前提
使用するモジュールは以下のとおりです
- Flask
- Flask-Login
- SQLAlchemy
- ulid-py
発生している問題・エラーメッセージ
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: roles.ulid [SQL: INSERT INTO roles (ulid, name) VALUES (?, ?)] [parameters: ('01GTV995JF912S32TC2QG6N5WB', 'User')] (Background on this error at: https://sqlalche.me/e/14/gkpj)
該当のソースコード
テーブルの定義
python
1class USER_ROLE(db.Model): 2 __tablename__ = 'user_role' 3 user_id = db.Column(db.Integer(), ForeignKey('users.ulid', ondelete='CASCADE'), primary_key=True) 4 role_id = db.Column(db.Integer(), ForeignKey('roles.ulid', ondelete='CASCADE'), primary_key=True) 5 6class USERS(db.Model, UserMixin): 7 __tablename__ = 'users' 8 9 ulid = db.Column(db.Text(26), primary_key=True, default = ulid.new().str) 10 name = db.Column(db.String(100), unique = True) 11 password = db.Column(db.String(100)) 12 display_name = db.Column(db.String(100)) 13 14 # Relationships 15 pages = db.relationship('PAGES', secondary=UP.__tablename__, back_populates='author') 16 roles = db.relationship('ROLES', secondary='ur') 17 18class ROLES(db.Model): 19 __tablename__ = 'roles' 20 ulid = db.Column(db.Text(26), primary_key=True, default = ulid.new().str) 21 name = db.Column(db.String(50), unique=True)
初期化
python
1@app.before_first_request 2def init(): 3 try: 4 tables.USERS.query.filter(tables.USERS.name=="admin").one_or_none() 5 except Exception: 6 db.create_all() 7 admin_role = tables.ROLES(name='Admin') 8 db.session.add(admin_role) 9 db.session.commit() 10 user_role = tables.ROLES(name='User') 11 db.session.add(user_role) 12 db.session.commit() 13 admin = tables.USERS( 14 name='admin', 15 display_name='Administrator', 16 password=generate_password_hash('password') 17 ) 18 admin.roles = [admin_role, student_role] 19 db.session.add(admin) 20 db.session.commit()
試したこと
初期化する部分のプログラムを特に見直しましたが同じロールを追加しているわけでもないので全く原因がわかりませんでした。
検証すればいいことがわからなかったので情報が少ないかもしれませんがよろしくお願いします

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/03/07 07:33