반응형

출처 : https://stackoverflow.com/questions/48232367/redshift-create-table-not-working-via-python

Python으로 Redshift의 create table이 작동하지 않습니다.

IAM 역할 자격 증명을 사용하는 Python에서 S3로 unload하기글을 참조하여 unload 문이 완벽하게 작동했습니다. COPY 및 SELECT 문과 같은 다른 명령도 시도했습니다.

하지만, 저는 테이블을 생성하는 쿼리를 실행하였습니다. CREATE TABLE 쿼리는 오류없이 실행되었지만, select 구문에 도달했을 때 `relation "public.test"가 존재하지 않는다는" 오류가 발생하였습니다.

왜 테이블이 적절히 만들어지지 않았는지 알 수 있을까요? 쿼리는 아래 있습니다.

import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker
import config
import pandas as pd

#>>>>>>>> 여기를 바꿨습니다. >>>>>>>>
DATABASE = "db"
USER = "user"
PASSWORD = getattr(config, 'password') # David Bern의 답변을 보세요. https://stackoverflow.com/questions/43136925/create-a-config-file-to-hold-values-like-username-password-url-in-python-behave/43137301
HOST = "host"
PORT = "5439"
SCHEMA = "public"      #default is "public"

########## 접속 및 세션 생성 ##########
connection_string = "redshift+psycopg2://%s:%s@%s:%s/%s" % (USER,PASSWORD,HOST,str(PORT),DATABASE)
engine = sa.create_engine(connection_string)
session = sessionmaker()
session.configure(bind=engine)
s = session()
SetPath = "SET search_path TO %s" % SCHEMA
s.execute(SetPath)

-- create table 예시
query2 = '''\ 
create table public.test (
id integer encode lzo,
user_id integer encode lzo,
created_at timestamp encode delta32k,
updated_at timestamp encode delta32k
)
distkey(id)
sortkey(id)
'''

r2 = s.execute(query2)

--select 예시
query4 = '''\ 
select * from public.test
'''

r4 = s.execute(query4)

########## SQL query 출력으로 DataFrame 생성 ##########
df = pd.read_sql_query(query4, connection_string)

print(df.head(50))

########## 마지막에 세션 닫기 ##########
s.close()

Redshift에서 직접 실행하면 잘 작동합니다

--편집내용--

시도해 본 것 중에 일부입니다.

  • query에서 \를 제거하였습니다.
  • 문자열 끝에 ";"를 추가하였습니다.
  • "public.test"를 "test"로 변경하였습니다.
  • SetPath = "SET search_path TO %s" % SCHEMA 와 s.execute(SetPath) 구문 제거
  • create 구문을 break. 예상되는 오류 생성
  • create 후에 S3 명령으로 copy를 추가하였지만 다시 테이블이 생성되지 않습니다.
  • copy 명령에서 생성된 파일에 존재하지 않는 문을 생성하기 위해 열을 추가하면 예상 오류가 생성됩니다.
  • r4 = s.execute(query)를 추가 - 오류 없이 실행되지만 Redshift에서 다시 테이블이 생성되지 않습니다.

1개의 답변

테이블을 생성하려면 s.commit()을 추가해야합니다. COPY 명령을 통해 채우거나 다음 위치에 INSERT INTO하는 경우 : COPY 명령 다음에 추가하십시오 (테이블 생성 후는 선택 사항임). 기본적으로 CREATE/ALTER 명령을 자동 커밋하지 않습니다!

http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#session-faq-whentocreate
http://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit

반응형
반응형

출처 : https://stackoverflow.com/questions/35115585/remove-file-from-all-commits

모든 commit에서 파일 지우기

저는 폰트 파일을 업로드 했고 github에 (그 폰트파일을) 몇가지 업데이트를 배포할 권리가 없습니다.

저는 상대적으로 비활성화된 저장소를 가지고 있고 필요할 때 모든 멤버들에게 알릴 수 있는 능력이 있습니다. 저는 이 해결책 중 몇가지를 사용하였습니다. 저는 폰트의 이탈릭체와 진하기 버전의 이름 %font%가 있는 Resources\Video\%font%.ttf 라고 불리는 디렉터리에 파일을 지울 필요가 있습니다. 제가 사용해야 할 명령어는 무엇일까요?

4개의 답변 중 1개의 답변

이러한 경우 당신은 --tree-filter 옵션과 함께 Git Filter Branch 명령을 사용할 수 있습니다.

문법은 git filter-branch --tree-filter <명령> ... 입니다.

git filter-branch --tree-filter 'rm -f Resources\Video\%font%.ttf' -- --all

윈도우즈에서는 / 대신에 \를 사용해야 합니다.

명령어에 대한 설명:

< 명령 > : 구체적인 어떤 shell 명령

--tree-filter : Git은 작업 디렉터리에서 각 commit을 체크하고 당신의 명령을 실행하고 다시 commit할 것입니다.

--index-filter : Git은 git 히스토리는 갱신하지만 작업 디렉터리는 갱신하지 않습니다.

--all : 모든 branch에서 모든 commit을 filter 적용을 합니다.

참고 : 파일 경로가 확실하지 않으므로 파일 경로를 확인하십시오.

이것이 당신에게 도움이 되기를 바랍니다.

반응형
반응형

출처 : http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html

잃어버린 commit들 복구하기

만약 당신이 마지막 commit을 버리기 위해 git reset --hard HEAD^ 를 실행하였습니다. 그런데 그 변경이 필요하지 않았음이 밝혀졌습니다.  당신은 두 번 다시 완벽하게 알고리즘을 구현할 수 없고 다시 원래대로 복구해야 합니다. 겁먹지 말고 git은 당신의 잃어버린 그 commit을 가지고 있습니다. reset할 때 당신이 버린 commit은 "dangling" 상태가 됩니다. 그것은 git의 데이터로 보관되어 있고 다음 garbage collection 때 치워질 것입니다. 당신이 위 명령을 실행했을 때 부터 git gc를 실행하지 않는다면 당신은 그것을 복구할 수 있습니다.

예를 들어 저는 이 블로그를 위한 코드를 작성하였습니다. 그리고 바로 다음을 실행합니다.

$ git show-ref -h HEAD
  7c61179cbe51c050c5520b4399f7b14eec943754 HEAD

$ git reset --hard HEAD^
  HEAD is now at 39ba87b Fixing about and submit pages so they don't look stupid

$ git show-ref -h HEAD
  39ba87bf28b5bb223feffafb59638f6f46908cac HEAD

우리의 HEAD는 하나의 commit으로 저장된 상태입니다. 이 때 우리는 git pull으로 그것을 원래대로 돌릴 수 있다면 우리의 local repository는 그 commit을 알고 있다고 가정할 수 있습니다. 우리는 그것을 원래대로 돌리기 위해 그 commit의 SHA1이 필요합니다. 우리는 fsck명령으로 그 commit에 대해 알고 있다는 것을 증명할 수 있습니다.

$ git fsck --lost-found
  [... some blobs omitted ...]
  dangling commit 7c61179cbe51c050c5520b4399f7b14eec943754

또한, git은 reflog명령을 사용하여 아직 그 commit에 대해 알고 있다는 것을 확인 할 수 있습니다.

$ git reflog
  39ba87b... HEAD@{0}: HEAD~1: updating HEAD
  7c61179... HEAD@{1}: pull origin master: Fast forward
  [... lots of other refs ...]

결국, 우리는 복구하고자 하는 SHA1:7c61179 을 알았습니다. 만약 현재 branch에 복구하고자 하는 그 commit을 바로 적용하려면, git merge함으로서 그 commit으로 복구할 것입니다.

$ git merge 7c61179
  Updating 39ba87b..7c61179
  Fast forward
    css/screen.css |    4 ++++
    submit.html    |    4 ++--
    2 files changed, 6 insertions(+), 2 deletions(-)

이 명령은 우리의 잃어버린 변화들을 되돌릴 것이고 HEAD가 그 commit을 가리키도록 보장할 것입니다. 여기서부터 평소처럼 작업을 이어서 할 수 있습니다. 또한, 당신은 새로운 branch로 복구할 SHA1을 checkout할 수 있지만 merge가 당신이 그 hash를 가지고 있을 때 잃어버린 commit을 복구하는 가장 빠르고 쉬운 방법입니다. 혹시 당신이 다른 방법을 알고 계시면 댓글을 남겨주세요!

만약 이러한 상황에서 할 수 있는 더 많은 option들을 알고 싶다면, Mathieu Martin’s illustrated guide to recovering lost commits with Git이 충분히 당신에게 도움이 될 것입니다.


반응형
반응형

출처 : http://stackoverflow.com/questions/5471174/git-move-branch-pointer-to-different-commit

Git: branch 포인터를 특정 commit으로 이동하게 하기.

check-out된 branch의 포인터를 이동하기 위해 git reset --hard 명령을 사용할 수 있습니다. 하지만 check-out되지 않은 branch의 포인터를 다른 commit을 가리키도록 이동하는 방법을 알고 싶습니다. (기존에 추적중인 원격 branch같은 다른 정보들은 유지되어야 합니다.)


3 개의 답변 중 1개의 답변만 추려냄.

git branch -f <branch-name> [<new-tip-commit>]

만약 new-tip-commit 이 생략되면 기본적으로 현재 commit을 가리킵니다.

반응형

'Git' 카테고리의 다른 글

git log  (0) 2015.08.31
Git에서 새롭고 비어 있는 branch를 만드는 방법  (0) 2015.07.17
Git: 파일 checkout 없이 git branch 변경하기  (0) 2015.03.18
잃어버린 commit들 복구하기.  (0) 2015.01.22
git config  (2) 2014.11.14

+ Recent posts