आपका PRIMARY KEY
एक SEQUENCE
. का उपयोग करने के लिए परिभाषित किया जाना चाहिए DEFAULT
. के रूप में , या तो SERIAL
. के माध्यम से सुविधा छद्म प्रकार:
CREATE TABLE blah (
id serial primary key,
...
);
या एक स्पष्ट SEQUENCE
:
CREATE SEQUENCE blah_id_seq;
CREATE TABLE blah (
id integer primary key default nextval('blah_id_seq'),
...
);
ALTER SEQUENCE blah_id_seq OWNED BY blah.id;
यह SQLAlchemy प्रलेखन में चर्चा की गई है ।
आप इसे किसी मौजूदा तालिका में जोड़ सकते हैं:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
यदि आप डंप को पुनर्स्थापित करना पसंद करते हैं तो मैन्युअल रूप से अनुक्रम जोड़ें।
यदि कोई मौजूदा डेटा है जिसे आपने सीधे COPY
. के साथ तालिका में लोड किया है या इसी तरह, आपको अनुक्रम प्रारंभिक बिंदु सेट करने की आवश्यकता है:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
मैं कहूंगा कि समस्या SQLite में आपके विकास के साथ होने की संभावना है, फिर डंप कर रही है और उस डंप को PostgreSQL पर पुनर्स्थापित कर रही है। SQLAlchemy उपयुक्त डिफ़ॉल्ट और अनुक्रमों के साथ स्वयं स्कीमा बनाने की अपेक्षा करता है।
इसके बजाय मैं आपको एक नया, खाली डेटाबेस बनाने के लिए SQLAlchemy प्राप्त करने की सलाह देता हूं। SQLite DB से CSV में प्रत्येक तालिका के लिए डेटा डंप करें, फिर COPY
वह डेटा PostgreSQL टेबल में। अंत में, अनुक्रमों को setval
. के साथ अपडेट करें इसलिए वे उपयुक्त मान उत्पन्न करते हैं।
किसी न किसी रूप में, आपको जरूरत होगी यह सुनिश्चित करने के लिए कि उपयुक्त अनुक्रम बनाए गए हैं। आप इसे SERIAL
. द्वारा कर सकते हैं छद्म-स्तंभ प्रकार, या मैन्युअल SEQUENCE
. द्वारा निर्माण और DEFAULT
सेटिंग, लेकिन आपको यह करना होगा। अन्यथा तालिका में एक कुशल, समवर्ती-सुरक्षित तरीके से जेनरेट की गई आईडी असाइन करने का कोई तरीका नहीं है।