bestsource

SQLITE SQL 덤프 파일을 POSTGRESQL로 변환

bestsource 2023. 6. 3. 08:33
반응형

SQLITE SQL 덤프 파일을 POSTGRESQL로 변환

저는 POSTGRESQL에서 생산하는 SQLITE 데이터베이스를 사용하여 개발을 진행하고 있습니다.방금 로컬 데이터베이스를 대량의 데이터로 업데이트했기 때문에 특정 테이블을 프로덕션 데이터베이스로 전송해야 합니다.

를 실행하는 sqlite database .dump > /the/path/to/sqlite-dumpfile.sqlSQLITE는 다음 형식으로 테이블 덤프를 출력합니다.

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 스의로변으로 변경합니다.timestampPostgre용SQL. (클레이가 지적해 주셔서 감사합니다.)

를 변환할 수 .1그리고.01::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와 대부분 호환되는 것 같습니다.은 몇 할 수 .psqlSQL 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

를 하기 위해 대본을 썼습니다.sqlite3postgres이주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

반응형