Skip to content

Commit 66ddec1

Browse files
committed
Update to MB DB Schema 29 - 2024 Q2
1 parent 0406f63 commit 66ddec1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+343
-14171
lines changed

mbdata/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# Copyright (C) 2013 Lukas Lalinsky
22
# Distributed under the MIT license, see the LICENSE file for details.
33

4-
__version__ = "27.1.0"
4+
__version__ = "29.0.0"

mbdata/models.py

+48-55
Original file line numberDiff line numberDiff line change
@@ -838,7 +838,6 @@ class CDTOC(Base):
838838
track_count = Column(Integer, nullable=False)
839839
leadout_offset = Column(Integer, nullable=False)
840840
track_offset = Column(Integer, nullable=False)
841-
degraded = Column(Boolean, nullable=False, default=False, server_default=sql.false())
842841
created = Column(DateTime(timezone=True), server_default=sql.func.now())
843842

844843

@@ -937,6 +936,26 @@ class EditNote(Base):
937936
edit = relationship('Edit', foreign_keys=[edit_id], innerjoin=True)
938937

939938

939+
class EditNoteChange(Base):
940+
__tablename__ = 'edit_note_change'
941+
__table_args__ = (
942+
Index('edit_note_change_idx_edit_note', 'edit_note'),
943+
{'schema': mbdata.config.schemas.get('musicbrainz', 'musicbrainz')}
944+
)
945+
946+
id = Column(Integer, primary_key=True)
947+
status = Column(Enum('deleted', 'edited', name='EDIT_NOTE_STATUS', schema=mbdata.config.schemas.get('musicbrainz', 'musicbrainz')))
948+
edit_note_id = Column('edit_note', Integer, ForeignKey(apply_schema('edit_note.id', 'musicbrainz'), name='edit_note_change_fk_edit_note'), nullable=False)
949+
change_editor_id = Column('change_editor', Integer, ForeignKey(apply_schema('editor.id', 'musicbrainz'), name='edit_note_change_fk_change_editor'), nullable=False)
950+
change_time = Column(DateTime(timezone=True), server_default=sql.func.now())
951+
old_note = Column(String, nullable=False)
952+
new_note = Column(String, nullable=False)
953+
reason = Column(String, nullable=False, default='', server_default=sql.text("''"))
954+
955+
edit_note = relationship('EditNote', foreign_keys=[edit_note_id], innerjoin=True)
956+
change_editor = relationship('Editor', foreign_keys=[change_editor_id], innerjoin=True)
957+
958+
940959
class EditNoteRecipient(Base):
941960
__tablename__ = 'edit_note_recipient'
942961
__table_args__ = (
@@ -6526,7 +6545,6 @@ class LinkType(Base):
65266545
link_phrase = Column(String(255), nullable=False)
65276546
reverse_link_phrase = Column(String(255), nullable=False)
65286547
long_link_phrase = Column(String(255), nullable=False)
6529-
priority = Column(Integer, nullable=False, default=0, server_default=sql.text('0'))
65306548
last_updated = Column(DateTime(timezone=True), server_default=sql.func.now())
65316549
is_deprecated = Column(Boolean, nullable=False, default=False, server_default=sql.false())
65326550
has_dates = Column(Boolean, nullable=False, default=True, server_default=sql.true())
@@ -6673,6 +6691,22 @@ class EditorCollectionEvent(Base):
66736691
event = relationship('Event', foreign_keys=[event_id], innerjoin=True)
66746692

66756693

6694+
class EditorCollectionGenre(Base):
6695+
__tablename__ = 'editor_collection_genre'
6696+
__table_args__ = (
6697+
{'schema': mbdata.config.schemas.get('musicbrainz', 'musicbrainz')}
6698+
)
6699+
6700+
collection_id = Column('collection', Integer, ForeignKey(apply_schema('editor_collection.id', 'musicbrainz'), name='editor_collection_genre_fk_collection'), nullable=False, primary_key=True)
6701+
genre_id = Column('genre', Integer, ForeignKey(apply_schema('genre.id', 'musicbrainz'), name='editor_collection_genre_fk_genre'), nullable=False, primary_key=True)
6702+
added = Column(DateTime(timezone=True), server_default=sql.func.now())
6703+
position = Column(Integer, nullable=False, default=0, server_default=sql.text('0'))
6704+
comment = Column(String, nullable=False, default='', server_default=sql.text("''"))
6705+
6706+
collection = relationship('EditorCollection', foreign_keys=[collection_id], innerjoin=True)
6707+
genre = relationship('Genre', foreign_keys=[genre_id], innerjoin=True)
6708+
6709+
66766710
class EditorCollectionInstrument(Base):
66776711
__tablename__ = 'editor_collection_instrument'
66786712
__table_args__ = (
@@ -6841,59 +6875,6 @@ class EditorOauthToken(Base):
68416875
application = relationship('Application', foreign_keys=[application_id], innerjoin=True)
68426876

68436877

6844-
class EditorWatchPreferences(Base):
6845-
__tablename__ = 'editor_watch_preferences'
6846-
__table_args__ = (
6847-
{'schema': mbdata.config.schemas.get('musicbrainz', 'musicbrainz')}
6848-
)
6849-
6850-
editor_id = Column('editor', Integer, ForeignKey(apply_schema('editor.id', 'musicbrainz'), name='editor_watch_preferences_fk_editor', ondelete='CASCADE'), nullable=False, primary_key=True)
6851-
notify_via_email = Column(Boolean, nullable=False, default=True, server_default=sql.true())
6852-
notification_timeframe = Column(Interval, nullable=False, default='1 week', server_default=sql.text("'1 week'"))
6853-
last_checked = Column(DateTime(timezone=True), nullable=False, server_default=sql.func.now())
6854-
6855-
editor = relationship('Editor', foreign_keys=[editor_id], innerjoin=True)
6856-
6857-
6858-
class EditorWatchArtist(Base):
6859-
__tablename__ = 'editor_watch_artist'
6860-
__table_args__ = (
6861-
{'schema': mbdata.config.schemas.get('musicbrainz', 'musicbrainz')}
6862-
)
6863-
6864-
artist_id = Column('artist', Integer, ForeignKey(apply_schema('artist.id', 'musicbrainz'), name='editor_watch_artist_fk_artist', ondelete='CASCADE'), nullable=False, primary_key=True)
6865-
editor_id = Column('editor', Integer, ForeignKey(apply_schema('editor.id', 'musicbrainz'), name='editor_watch_artist_fk_editor', ondelete='CASCADE'), nullable=False, primary_key=True)
6866-
6867-
artist = relationship('Artist', foreign_keys=[artist_id], innerjoin=True)
6868-
editor = relationship('Editor', foreign_keys=[editor_id], innerjoin=True)
6869-
6870-
6871-
class EditorWatchReleaseGroupType(Base):
6872-
__tablename__ = 'editor_watch_release_group_type'
6873-
__table_args__ = (
6874-
{'schema': mbdata.config.schemas.get('musicbrainz', 'musicbrainz')}
6875-
)
6876-
6877-
editor_id = Column('editor', Integer, ForeignKey(apply_schema('editor.id', 'musicbrainz'), name='editor_watch_release_group_type_fk_editor', ondelete='CASCADE'), nullable=False, primary_key=True)
6878-
release_group_type_id = Column('release_group_type', Integer, ForeignKey(apply_schema('release_group_primary_type.id', 'musicbrainz'), name='editor_watch_release_group_type_fk_release_group_type'), nullable=False, primary_key=True)
6879-
6880-
editor = relationship('Editor', foreign_keys=[editor_id], innerjoin=True)
6881-
release_group_type = relationship('ReleaseGroupPrimaryType', foreign_keys=[release_group_type_id], innerjoin=True)
6882-
6883-
6884-
class EditorWatchReleaseStatus(Base):
6885-
__tablename__ = 'editor_watch_release_status'
6886-
__table_args__ = (
6887-
{'schema': mbdata.config.schemas.get('musicbrainz', 'musicbrainz')}
6888-
)
6889-
6890-
editor_id = Column('editor', Integer, ForeignKey(apply_schema('editor.id', 'musicbrainz'), name='editor_watch_release_status_fk_editor', ondelete='CASCADE'), nullable=False, primary_key=True)
6891-
release_status_id = Column('release_status', Integer, ForeignKey(apply_schema('release_status.id', 'musicbrainz'), name='editor_watch_release_status_fk_release_status'), nullable=False, primary_key=True)
6892-
6893-
editor = relationship('Editor', foreign_keys=[editor_id], innerjoin=True)
6894-
release_status = relationship('ReleaseStatus', foreign_keys=[release_status_id], innerjoin=True)
6895-
6896-
68976878
class Medium(Base):
68986879
__tablename__ = 'medium'
68996880
__table_args__ = (
@@ -8573,6 +8554,18 @@ class MediumIndex(Base):
85738554
medium = relationship('Medium', foreign_keys=[medium_id])
85748555

85758556

8557+
class UnreferencedRowLog(Base):
8558+
__tablename__ = 'unreferenced_row_log'
8559+
__table_args__ = (
8560+
Index('unreferenced_row_log_idx_inserted', 'inserted'),
8561+
{'schema': mbdata.config.schemas.get('musicbrainz', 'musicbrainz')}
8562+
)
8563+
8564+
table_name = Column(String, nullable=False, primary_key=True)
8565+
row_id = Column(Integer, nullable=False, primary_key=True)
8566+
inserted = Column(DateTime(timezone=True), server_default=sql.func.now())
8567+
8568+
85768569
class URL(Base):
85778570
__tablename__ = 'url'
85788571
__table_args__ = (

mbdata/sql/CreateConstraints.sql

+3-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ ALTER TABLE artist_alias
4141
ALTER TABLE editor_collection_type
4242
ADD CONSTRAINT allowed_collection_entity_type CHECK (
4343
entity_type IN (
44-
'area', 'artist', 'event', 'instrument', 'label',
44+
'area', 'artist', 'event', 'genre', 'instrument', 'label',
4545
'place', 'recording', 'release', 'release_group',
4646
'series', 'work'
4747
)
@@ -76,7 +76,8 @@ ALTER TABLE instrument_alias
7676

7777
ALTER TABLE label
7878
ADD CONSTRAINT control_for_whitespace CHECK (controlled_for_whitespace(name)),
79-
ADD CONSTRAINT only_non_empty CHECK (name != '');
79+
ADD CONSTRAINT only_non_empty CHECK (name != ''),
80+
ADD CONSTRAINT label_code_length CHECK (label_code > 0 AND label_code < 1000000);
8081

8182
ALTER TABLE label_alias
8283
ADD CONSTRAINT control_for_whitespace CHECK (controlled_for_whitespace(name)),

mbdata/sql/CreateFKConstraints.sql

+20-40
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,16 @@ ALTER TABLE edit_note
500500
FOREIGN KEY (edit)
501501
REFERENCES edit(id);
502502

503+
ALTER TABLE edit_note_change
504+
ADD CONSTRAINT edit_note_change_fk_edit_note
505+
FOREIGN KEY (edit_note)
506+
REFERENCES edit_note(id);
507+
508+
ALTER TABLE edit_note_change
509+
ADD CONSTRAINT edit_note_change_fk_change_editor
510+
FOREIGN KEY (change_editor)
511+
REFERENCES editor(id);
512+
503513
ALTER TABLE edit_note_recipient
504514
ADD CONSTRAINT edit_note_recipient_fk_recipient
505515
FOREIGN KEY (recipient)
@@ -657,6 +667,16 @@ ALTER TABLE editor_collection_event
657667
FOREIGN KEY (event)
658668
REFERENCES event(id);
659669

670+
ALTER TABLE editor_collection_genre
671+
ADD CONSTRAINT editor_collection_genre_fk_collection
672+
FOREIGN KEY (collection)
673+
REFERENCES editor_collection(id);
674+
675+
ALTER TABLE editor_collection_genre
676+
ADD CONSTRAINT editor_collection_genre_fk_genre
677+
FOREIGN KEY (genre)
678+
REFERENCES genre(id);
679+
660680
ALTER TABLE editor_collection_gid_redirect
661681
ADD CONSTRAINT editor_collection_gid_redirect_fk_new_id
662682
FOREIGN KEY (new_id)
@@ -877,46 +897,6 @@ ALTER TABLE editor_subscribe_series_deleted
877897
FOREIGN KEY (deleted_by)
878898
REFERENCES edit(id);
879899

880-
ALTER TABLE editor_watch_artist
881-
ADD CONSTRAINT editor_watch_artist_fk_artist
882-
FOREIGN KEY (artist)
883-
REFERENCES artist(id)
884-
ON DELETE CASCADE;
885-
886-
ALTER TABLE editor_watch_artist
887-
ADD CONSTRAINT editor_watch_artist_fk_editor
888-
FOREIGN KEY (editor)
889-
REFERENCES editor(id)
890-
ON DELETE CASCADE;
891-
892-
ALTER TABLE editor_watch_preferences
893-
ADD CONSTRAINT editor_watch_preferences_fk_editor
894-
FOREIGN KEY (editor)
895-
REFERENCES editor(id)
896-
ON DELETE CASCADE;
897-
898-
ALTER TABLE editor_watch_release_group_type
899-
ADD CONSTRAINT editor_watch_release_group_type_fk_editor
900-
FOREIGN KEY (editor)
901-
REFERENCES editor(id)
902-
ON DELETE CASCADE;
903-
904-
ALTER TABLE editor_watch_release_group_type
905-
ADD CONSTRAINT editor_watch_release_group_type_fk_release_group_type
906-
FOREIGN KEY (release_group_type)
907-
REFERENCES release_group_primary_type(id);
908-
909-
ALTER TABLE editor_watch_release_status
910-
ADD CONSTRAINT editor_watch_release_status_fk_editor
911-
FOREIGN KEY (editor)
912-
REFERENCES editor(id)
913-
ON DELETE CASCADE;
914-
915-
ALTER TABLE editor_watch_release_status
916-
ADD CONSTRAINT editor_watch_release_status_fk_release_status
917-
FOREIGN KEY (release_status)
918-
REFERENCES release_status(id);
919-
920900
ALTER TABLE event
921901
ADD CONSTRAINT event_fk_type
922902
FOREIGN KEY (type)

mbdata/sql/CreateFunctions.sql

+23-20
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,12 @@ DECLARE
101101
ref_count integer;
102102
BEGIN
103103
-- decrement ref_count for the old name,
104-
-- or delete it if ref_count would drop to 0
104+
-- or prepare it for deletion if ref_count would drop to 0
105105
EXECUTE 'SELECT ref_count FROM ' || tbl || ' WHERE id = ' || row_id || ' FOR UPDATE' INTO ref_count;
106106
IF ref_count <= val THEN
107-
EXECUTE 'DELETE FROM ' || tbl || ' WHERE id = ' || row_id;
108-
ELSE
109-
EXECUTE 'UPDATE ' || tbl || ' SET ref_count = ref_count - ' || val || ' WHERE id = ' || row_id;
107+
EXECUTE 'INSERT INTO unreferenced_row_log (table_name, row_id) VALUES ($1, $2)' USING tbl, row_id;
110108
END IF;
109+
EXECUTE 'UPDATE ' || tbl || ' SET ref_count = ref_count - ' || val || ' WHERE id = ' || row_id;
111110
RETURN;
112111
END;
113112
$$ LANGUAGE 'plpgsql';
@@ -204,21 +203,6 @@ $$ LANGUAGE 'plpgsql';
204203
-- editor triggers
205204
-----------------------------------------------------------------------
206205

207-
CREATE OR REPLACE FUNCTION a_ins_editor() RETURNS trigger AS $$
208-
BEGIN
209-
-- add a new entry to the editor_watch_preference table
210-
INSERT INTO editor_watch_preferences (editor) VALUES (NEW.id);
211-
212-
-- by default watch for new official albums
213-
INSERT INTO editor_watch_release_group_type (editor, release_group_type)
214-
VALUES (NEW.id, 2);
215-
INSERT INTO editor_watch_release_status (editor, release_status)
216-
VALUES (NEW.id, 1);
217-
218-
RETURN NULL;
219-
END;
220-
$$ LANGUAGE 'plpgsql';
221-
222206
CREATE OR REPLACE FUNCTION check_editor_name() RETURNS trigger AS $$
223207
BEGIN
224208
IF (SELECT 1 FROM old_editor_name WHERE lower(name) = lower(NEW.name))
@@ -495,6 +479,19 @@ BEGIN
495479
PERFORM dec_ref_count('artist_credit', OLD.artist_credit, 1);
496480
PERFORM inc_ref_count('artist_credit', NEW.artist_credit, 1);
497481
END IF;
482+
IF (
483+
NEW.status IS DISTINCT FROM OLD.status AND
484+
(NEW.status = 6 OR OLD.status = 6)
485+
) THEN
486+
PERFORM set_release_first_release_date(NEW.id);
487+
488+
-- avoid executing it twice as this will be executed a few lines below if RG changes
489+
IF NEW.release_group = OLD.release_group THEN
490+
PERFORM set_release_group_first_release_date(NEW.release_group);
491+
END IF;
492+
493+
PERFORM set_releases_recordings_first_release_dates(ARRAY[NEW.id]);
494+
END IF;
498495
IF NEW.release_group != OLD.release_group THEN
499496
-- release group is changed, decrement release_count in the original RG, increment in the new one
500497
UPDATE release_group_meta SET release_count = release_count - 1 WHERE id = OLD.release_group;
@@ -1082,7 +1079,13 @@ BEGIN
10821079
SELECT release, date_year, date_month, date_day FROM release_unknown_country
10831080
) all_dates
10841081
WHERE ' || condition ||
1085-
' ORDER BY release, year NULLS LAST, month NULLS LAST, day NULLS LAST';
1082+
' AND NOT EXISTS (
1083+
SELECT TRUE
1084+
FROM release
1085+
WHERE release.id = all_dates.release
1086+
AND status = 6
1087+
)
1088+
ORDER BY release, year NULLS LAST, month NULLS LAST, day NULLS LAST';
10861089
END;
10871090
$$ LANGUAGE 'plpgsql' STRICT;
10881091

mbdata/sql/CreateIndexes.sql

+5-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ CREATE INDEX edit_data_idx_link_type ON edit_data USING GIN (
147147
(data#>>'{link,link_type,id}')::int,
148148
(data#>>'{old,link_type,id}')::int,
149149
(data#>>'{new,link_type,id}')::int,
150-
(data#>>'{relationship,link_type,id}')::int
150+
(data#>>'{relationship,link,type,id}')::int
151151
], NULL)
152152
);
153153

@@ -170,6 +170,8 @@ CREATE INDEX edit_url_idx ON edit_url (url);
170170
CREATE INDEX edit_note_idx_edit ON edit_note (edit);
171171
CREATE INDEX edit_note_idx_editor ON edit_note (editor);
172172

173+
CREATE INDEX edit_note_change_idx_edit_note ON edit_note_change (edit_note);
174+
173175
CREATE INDEX edit_note_recipient_idx_recipient ON edit_note_recipient (recipient);
174176

175177
CREATE UNIQUE INDEX event_idx_gid ON event (gid);
@@ -671,6 +673,8 @@ CREATE INDEX track_raw_idx_release ON track_raw (release);
671673
CREATE INDEX medium_idx_track_count ON medium (track_count);
672674
CREATE INDEX medium_index_idx ON medium_index USING gist (toc);
673675

676+
CREATE INDEX unreferenced_row_log_idx_inserted ON unreferenced_row_log USING BRIN (inserted);
677+
674678
CREATE UNIQUE INDEX url_idx_gid ON url (gid);
675679
CREATE UNIQUE INDEX url_idx_url ON url (url);
676680

mbdata/sql/CreatePrimaryKeys.sql

+3-4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ ALTER TABLE edit_instrument ADD CONSTRAINT edit_instrument_pkey PRIMARY KEY (edi
5454
ALTER TABLE edit_label ADD CONSTRAINT edit_label_pkey PRIMARY KEY (edit, label);
5555
ALTER TABLE edit_mood ADD CONSTRAINT edit_mood_pkey PRIMARY KEY (edit, mood);
5656
ALTER TABLE edit_note ADD CONSTRAINT edit_note_pkey PRIMARY KEY (id);
57+
ALTER TABLE edit_note_change ADD CONSTRAINT edit_note_change_pkey PRIMARY KEY (id);
5758
ALTER TABLE edit_note_recipient ADD CONSTRAINT edit_note_recipient_pkey PRIMARY KEY (recipient, edit_note);
5859
ALTER TABLE edit_place ADD CONSTRAINT edit_place_pkey PRIMARY KEY (edit, place);
5960
ALTER TABLE edit_recording ADD CONSTRAINT edit_recording_pkey PRIMARY KEY (edit, recording);
@@ -69,6 +70,7 @@ ALTER TABLE editor_collection_artist ADD CONSTRAINT editor_collection_artist_pke
6970
ALTER TABLE editor_collection_collaborator ADD CONSTRAINT editor_collection_collaborator_pkey PRIMARY KEY (collection, editor);
7071
ALTER TABLE editor_collection_deleted_entity ADD CONSTRAINT editor_collection_deleted_entity_pkey PRIMARY KEY (collection, gid);
7172
ALTER TABLE editor_collection_event ADD CONSTRAINT editor_collection_event_pkey PRIMARY KEY (collection, event);
73+
ALTER TABLE editor_collection_genre ADD CONSTRAINT editor_collection_genre_pkey PRIMARY KEY (collection, genre);
7274
ALTER TABLE editor_collection_gid_redirect ADD CONSTRAINT editor_collection_gid_redirect_pkey PRIMARY KEY (gid);
7375
ALTER TABLE editor_collection_instrument ADD CONSTRAINT editor_collection_instrument_pkey PRIMARY KEY (collection, instrument);
7476
ALTER TABLE editor_collection_label ADD CONSTRAINT editor_collection_label_pkey PRIMARY KEY (collection, label);
@@ -90,10 +92,6 @@ ALTER TABLE editor_subscribe_label ADD CONSTRAINT editor_subscribe_label_pkey PR
9092
ALTER TABLE editor_subscribe_label_deleted ADD CONSTRAINT editor_subscribe_label_deleted_pkey PRIMARY KEY (editor, gid);
9193
ALTER TABLE editor_subscribe_series ADD CONSTRAINT editor_subscribe_series_pkey PRIMARY KEY (id);
9294
ALTER TABLE editor_subscribe_series_deleted ADD CONSTRAINT editor_subscribe_series_deleted_pkey PRIMARY KEY (editor, gid);
93-
ALTER TABLE editor_watch_artist ADD CONSTRAINT editor_watch_artist_pkey PRIMARY KEY (artist, editor);
94-
ALTER TABLE editor_watch_preferences ADD CONSTRAINT editor_watch_preferences_pkey PRIMARY KEY (editor);
95-
ALTER TABLE editor_watch_release_group_type ADD CONSTRAINT editor_watch_release_group_type_pkey PRIMARY KEY (editor, release_group_type);
96-
ALTER TABLE editor_watch_release_status ADD CONSTRAINT editor_watch_release_status_pkey PRIMARY KEY (editor, release_status);
9795
ALTER TABLE event ADD CONSTRAINT event_pkey PRIMARY KEY (id);
9896
ALTER TABLE event_alias ADD CONSTRAINT event_alias_pkey PRIMARY KEY (id);
9997
ALTER TABLE event_alias_type ADD CONSTRAINT event_alias_type_pkey PRIMARY KEY (id);
@@ -350,6 +348,7 @@ ALTER TABLE tag_relation ADD CONSTRAINT tag_relation_pkey PRIMARY KEY (tag1, tag
350348
ALTER TABLE track ADD CONSTRAINT track_pkey PRIMARY KEY (id);
351349
ALTER TABLE track_gid_redirect ADD CONSTRAINT track_gid_redirect_pkey PRIMARY KEY (gid);
352350
ALTER TABLE track_raw ADD CONSTRAINT track_raw_pkey PRIMARY KEY (id);
351+
ALTER TABLE unreferenced_row_log ADD CONSTRAINT unreferenced_row_log_pkey PRIMARY KEY (table_name, row_id);
353352
ALTER TABLE url ADD CONSTRAINT url_pkey PRIMARY KEY (id);
354353
ALTER TABLE url_gid_redirect ADD CONSTRAINT url_gid_redirect_pkey PRIMARY KEY (gid);
355354
ALTER TABLE vote ADD CONSTRAINT vote_pkey PRIMARY KEY (id);

0 commit comments

Comments
 (0)