그외
PostgreSQL 사용법에 관한 기록
체봄
2021. 12. 6. 21:26
터미널에서 $ sudo -u postgres psql 을 치면 postgres로 접속된다.
postgres=# 로 바뀐 것을 확인할 수 있다.
여기서 postgres는 현재 DB 인스턴스명이다.
# \list 를 입력하면 모든 DB 인스턴스 목록을 확인할 수 있다.
다른 DB 인스턴스를 사용하려면 # \c 인스턴스명 을 입력해준다.
더 많은 명령어는 아래 블로그를 참고하면 좋을 것 같다 :)
이제 이곳에다가 SQL문을 그대로 작성할 수 있다.
주의할 점은 SQL문 맨 끝에 반드시 ; 를 붙여줘야 제대로 실행된다.
SQL문을 실행한 후 빠져나오려면 q를 눌러주면 된다.
유의사항
- 어떤 명령어에서는 테이블명 앞뒤에 double quote를 붙여줘야 잘 실행된다. (single quote도 안됨)
- ex) ALTER TABLE table1 ADD column1 varchar(5) null; 이라는 쿼리를 실행할 때 syntax error가 나서 구글링해본 결과, ALTER TABLE "table1" ADD column1 varchar(5) null; 로 해줘야 잘 실행되었다.
- SQL 쿼리문을 바르게 작성했는데 'ERROR: syntax error at or near "" ' 에러가 뜨는 경우
- 쿼리문을 문법에 안 맞게 작성해서 에러가 뜬 후, 다시 문법에 맞게 고쳐 썼는데도 에러가 날 수 있다.
- # \e 를 입력하면 최근에 실행했던 쿼리문이 적혀있는데, 문법에 안 맞게 작성했던 쿼리문과 고쳐 쓴 쿼리문이 써져 있을 것이다. 문법에 안 맞게 작성했던 쿼리문 부분을 지워주고 ctrl+x -> Y를 눌러 저장하고 나오면 제대로 쓴 쿼리문이 실행되어 결과가 출력된다.
- 일반적인 SQL 쿼리문과 문법이 다른 경우가 존재한다.
- ex) 테이블 컬럼 타입을 변경하려면 원래는 ALTER TABLE 테이블명 MODIFY 컬럼명 타입; 으로 작성하지만 postgre에서는 ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 TYPE 타입; 와 같이 작성해야 한다.
sqlalchemy를 이용해 postgresql 연결
예제 코드
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, ForeignKey
DB = {
"user": "",
"password": "",
"host": "",
"database": "",
"port": ""
}
engine = create_engine(f"postgresql://{DB['user']}:{DB['password']}@{DB['host']}/{DB['database']}", convert_unicode=False)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
Base.metadata.create_all(engine)
class ExampleTable(Base):
__tablename__ = 'example_table'
col1 = Column(String(10), primary_key=True)
col2 = Column(Text)
col3 = Column(Integer)
def __init__(self, col1, col2, col3):
self.col1 = col1
self.col2 = col2
self.col3 = col3
def __repr__(self):
return f"<ExampleTable('{self.col1}', '{self.col2}', '{self.col3}')>"
def get_col1(param: str):
return db_session.query(ExampleTable).filter_by(col1=param).all()
if __name__ == '__main__':
col1 = get_col1(param='abc')
참고
https://yujuwon.tistory.com/entry/SQLAlchemy-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
반응형