SQLITE SQL 덤프 파일을 POSTGRESQL로 변환
저는 POSTGRESQL에서 생산하는 SQLITE 데이터베이스를 사용하여 개발을 진행하고 있습니다.방금 로컬 데이터베이스를 대량의 데이터로 업데이트했기 때문에 특정 테이블을 프로덕션 데이터베이스로 전송해야 합니다.
를 실행하는 sqlite database .dump > /the/path/to/sqlite-dumpfile.sql
SQLITE는 다음 형식으로 테이블 덤프를 출력합니다.
BEGIN TRANSACTION;
CREATE TABLE "courses_school" ("id" integer PRIMARY KEY, "department_count" integer NOT NULL DEFAULT 0, "the_id" integer UNIQUE, "school_name" varchar(150), "slug" varchar(50));
INSERT INTO "courses_school" VALUES(1,168,213,'TEST Name A',NULL);
INSERT INTO "courses_school" VALUES(2,0,656,'TEST Name B',NULL);
....
COMMIT;
운영 서버로 가져올 수 있는 POSTGRESQL 호환 덤프 파일로 위의 내용을 변환하려면 어떻게 해야 합니까?
당신은 그 덤프 파일을 직접 공급할 수 있을 것입니다.psql
:
/path/to/psql -d database -U username -W < /the/path/to/sqlite-dumpfile.sql
만약 당신이 원한다면,id
열을 "자동 증분"으로 변경한 다음 테이블 작성 줄에서 유형을 "int"에서 "int"로 변경합니다. 다음 에 다음 값이 합니다.그런 다음 SQL은 NULL ID를 가진 INSERT에 다음 사용 가능한 값이 자동으로 할당되도록 해당 열에 시퀀스를 연결합니다. 스레그SQL도 .AUTOINCREMENT
명령을 제거해야 합니다.
또한 다음 항목을 확인할 수 있습니다.datetime
스의로변으로 변경합니다.timestamp
Postgre용SQL. (클레이가 지적해 주셔서 감사합니다.)
를 변환할 수 .1
그리고.0
1::boolean
그리고.0::boolean
( Postgre(으)로 내부에 있는 Postgre(으)로 할 수 가져오기 후 SQL.
하도록 스키마를 수 .bytea
일부 통화도 함께 사용해야 할 것입니다.하지만 처리해야 할 BLOB가 많은 경우 SQL을 망치는 것보다 좋아하는 언어로 빠르게 더러운 복사기를 쓰는 것이 더 쉬울 수 있습니다.
일반적으로 외부 키가 있는 경우 BEGIN/COMMIT 쌍 안에 명령을 배치하여 삽입 순서 문제를 방지하기 위해 조사해야 할 것입니다.
불리언, 블롭, 제약 사항 노트에 대해 Nicolas Riley에게 감사드립니다.
가지고 계신다면,`
일부 SQLite3 클라이언트에서 생성한 코드에서 제거해야 합니다.
도 PostGRESQL을 못합니다.unsigned
열을 삭제하거나 다음과 같은 사용자 지정 제약 조건을 추가할 수 있습니다.
CREATE TABLE tablename (
...
unsigned_column_name integer CHECK (unsigned_column_name > 0)
);
값을 SQLite 기은 같습니다로 합니다.''
스레그SQL을 해야 합니다.NULL
.
SQLite 덤프 파일의 구문이 Postgre와 대부분 호환되는 것 같습니다.은 몇 할 수 .psql
SQL INSERT를 통해 대량의 데이터를 가져오려면 시간이 좀 걸릴 수 있지만 효과가 있습니다.
pgloader
SQLite 덤프를 Postgre로 변환하는 방법을 검색할 때 이 게시물을 발견했습니다.SQL. 이 게시물은 인정되는 답변(그리고 그 +1에서 좋은 답변)을 가지고 있지만, 저는 이것을 추가하는 것이 중요하다고 생각합니다.
저는 여기서 솔루션을 조사하기 시작했고 더 자동화된 방법을 찾고 있다는 것을 깨달았습니다.위키 문서를 찾아봤습니다.
https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL
발견된 그고발된견리된.pgloader
꽤 멋진 애플리케이션이고 비교적 사용하기 쉽습니다./SQLite 파일로 할 수 있습니다.SQL 데이터베이스.에서 했습니다.*.deb
생한데는터이를 만들었습니다.command
다음과 같은 파일을 테스트 디렉토리에 저장합니다.
load database
from 'db.sqlite3'
into postgresql:///testdb
with include drop, create tables, create indexes, reset sequences
set work_mem to '16MB', maintenance_work_mem to '512 MB';
문서 상태처럼.그런 다음 다음testdb
와 함께createdb
:
createdb testdb
실행했습니다.pgloader
다음과 같은 명령:
pgloader command
새 데이터베이스에 연결합니다.
psql testdb
데이터를 확인하기 위해 몇 가지 쿼리를 실행한 결과, 꽤 잘 작동한 것으로 보입니다.이러한 스크립트 중 하나를 실행하거나 여기에 언급된 단계적 변환을 수행했다면 훨씬 더 많은 시간을 할애했을 것입니다.
내가 이걸 버린 개념을 증명하기 위해.testdb
그리고 프로덕션 서버의 개발 환경으로 가져와 데이터가 잘 전송되었습니다.
후속 보석(Ruby 라이브러리)은 서로 다른 데이터베이스 간의 데이터 복사 기능을 제공합니다. http://sequel.jeremyevans.net/rdoc/files/doc/bin_sequel_rdoc.html#label-Copy+Databases
Ruby를 후, 을 실행하여 설치합니다.gem install sequel
.
sqlite의 경우에는 다음과 .sequel -C sqlite://db/production.sqlite3 postgres://user@localhost/db
를 하기 위해 대본을 썼습니다.sqlite3
postgres
이주https://stackoverflow.com/a/4581921/1303625, 에 언급된 스키마/데이터 변환을 모두 처리하지는 않지만 필요한 작업을 수행합니다.다른 사람들에게 좋은 출발점이 되기를 바랍니다.
https://gist.github.com/2253099
하나의 라이너를 사용할 수 있습니다. 다음은 sed 명령을 사용한 예제입니다.
sqlite3 mjsqlite.db .dump | sed -e 's/INTEGER PRIMARY KEY AUTOINCREMENT/SERIAL PRIMARY KEY/g;s/PRAGMA foreign_keys=OFF;//;s/unsigned big int/BIGINT/g;s/UNSIGNED BIG INT/BIGINT/g;s/BIG INT/BIGINT/g;s/UNSIGNED INT(10)/BIGINT/g;s/BOOLEAN/SMALLINT/g;s/boolean/SMALLINT/g;s/UNSIGNED BIG INT/INTEGER/g;s/INT(3)/INT2/g;s/DATETIME/TIMESTAMP/g' | psql mypqdb mypguser
pgloader는 sqlite의 데이터베이스를 postgresql로 변환하는 데 놀라운 일을 합니다.
다음은 로컬 sqlitedb를 원격 Postgre로 변환하는 예제입니다.SQL db:
pgloader sqlite.db postgresql://filename:password@dbname
다음 단계를 수행합니다...
01단계: SQLite db를 json에 덤프
python3 manage.py dumpdata > data.json
02단계: 마이그레이션 없이 테이블 만들기
python3 manage.py migrate --run-syncdb
03단계: 장고 껍질을 엽니다.그런 다음 내용 유형 데이터 제외
python3 manage.py shell
from django.contrib.contenttypes.models import ContentType
ContentType.objects.all().delete()
quit()
04단계: 데이터 로드
python3 manage.py loaddata data.json
sqlite dump를 편집/재익스펙션 해보았으므로 PostgreSQL은 이를 수락하며, 지루하고 오류가 발생하기 쉽습니다.
신속하게 작업할 수 있습니다.
먼저 Postgre에서 스키마 다시 만들기덤프를 편집하거나 ORM을 사용하는 경우 데이터가 없는 SQL은 운이 좋을 수 있으며 양쪽 백엔드(Sqlalchemy, peewee 등)와 통신합니다.
그런 다음 판다를 사용하여 데이터를 마이그레이션합니다.부울 필드(sqlite에서는 0/1이지만 Postgre에서는 b/f여야 함)가 있는 테이블이 있다고 가정합니다.SQL)
def int_to_strbool(df, column):
df = df.replace({column: 0}, 'f')
df = df.replace({column: 1}, 't')
return df
#def other_transform(df, column):
#...
conn = sqlite3.connect(db)
df = pd.read_sql(f'select * from {table_name}', conn)
df = int_to_strbool(df, bool_column_name)
#df = other_transform(df, other_column_name)
df.to_csv(table_name + '.csv'), sep=',', header=False, index=False)
이것은 (저에게는) 일반적인 표현과 달리, 각 기능을 쓰고 읽고 디버깅하기가 쉽습니다.
이제 테이블을 해당 소스 키로 로드한 후 외부 키로 테이블을 로드해야 한다는 유일한 주의 사항과 함께 결과 csv를 PostgreSQL(관리 도구를 사용하여 그래픽으로도 로드)로 로드할 수 있습니다.순환 의존증의 경우는 없었는데, 그렇다면 키 확인을 일시 중단해도 될 것 같습니다.
언급URL : https://stackoverflow.com/questions/4581727/convert-sqlite-sql-dump-file-to-postgresql
'bestsource' 카테고리의 다른 글
원격 데스크톱 연결 검색 중 (0) | 2023.06.03 |
---|---|
RVM과 rbenv는 실제로 어떻게 작동합니까? (0) | 2023.06.03 |
Python 3.x 정수의 경우 비트 시프트보다 2배 더 빠릅니까? (0) | 2023.06.03 |
Android에서 EditText의 텍스트 길이를 제한하는 가장 좋은 방법은 무엇입니까? (0) | 2023.06.03 |
UITableView 선택을 비활성화하려면 어떻게 해야 합니까? (0) | 2023.06.03 |