나는 복잡한 SQL 쿼리를 사용해야 하는 경우, 쉽게 유지보수하기 위해 아래와 같이 with cte  구문을 개인적으로 많이 사용한다. 물론 실질적으로 Python 에서 sqlalchemy 을 사용하기는 하지만 아래와 같이 코드가 나오도록 하는 편이다. 

with 테이블1 as (
    select ....
),
테이블2 as (
    select ....
),
테이블3 as (
    select ...
)
select ...
    from 테이블4
    left join  테이블1 과 테이블4
    left join  테이블2 과 테이블4
    left join  테이블3 과 테이블4

이렇게 만들어 두면 뭔가 더 해석하기 쉬워지는 느낌이 있다. 물론 테이블1, 테이블2, 테이블3 이런 것 내에서도 내부적으로 left join 이 들어 있을 수 있다. 그리고 이렇게 하는 추가적인 이유는 테이블1, 테이블2, 테이블3 이 row 수가 적당해서 괜찮은 속도를 내 줄거라는 기대도 있는 편이다. 
그런데 오늘 where 조건이 걸렸을 때 늦어지는 현상을 발견했다. 원인을 분석해 봤는데 내 의도대로 테이블1, 테이블2, 테이블3 가 만들어지지 않고 Postgresql 알아서 최적화 하면서 다른 방법으로 동작해지면 속도가 늦어졌다. 

 그래서 이 문제는 google gemini 물었더니 materialized  를 사용하라는 답변을 받았다. (물론 gemini 가 추천해준  SQL구문이 틀렸지만 나에게 도움이 되는 답변이었다.) 이런 구문을 cte materialized  라고 하는 것 같다. 

with 테이블1 as MATERIALIZED (
    select ....
),
테이블2 as MATERIALIZED (
    select ....
),
테이블3 as MATERIALIZED (
    select ...
)
select ...
    from 테이블4
    left join  테이블1 과 테이블4
    left join  테이블2 과 테이블4
    left join  테이블3 과 테이블4

이렇게 해 주면 내 의도대로 임시로 테이블1, 테이블2, 테이블3 를 만든다고 한다. 


만일 sqlalchemy 를 사용한다면 다음 처럼 사용할 수 있다. 

s = select([orders.c.order]).cte("regional_sales")
s = s.prefix_with("MATERIALIZED", dialect="postgresql")



서버 재부팅 때마다 flask 웹서버가 500에러가 발생하는 에러를 확인했다. 회사내 서버로 서버의 안정성을 위해 수요일 아침마다 서버를 재부팅 시키고 있다. 그런데 이렇게 재부팅 되고 나면 이상하게 flask 웹서버에서 에러가 발생했다. 

로그를 분석해 보면 이상하게 flask 웹서버가 시작되면서 postgresql 서버에 접속하지 못하고 에러가 발생했다. 그런데 수동으로 uwsgi 서비스를 재시작 시켜보면 정상적으로 DB에 접속해서 웹서버가 정상적으로 동작했다.

Ubuntu 24.04 에 시스템을 설정하면서 처음 겪는 현상으로  Postgresql 서버 서비스가 동작하기 전에 uwsgi 서비스가 동작하면서 문제를 일으키는 것으로 추정했다. 찾아보니 Systemd 설정 파일에서 Before 와 After 를 이용해서 다른 시스템과 순서를 제어하는 방법이 있다는 것을 알게되었다. 그래서 아래와 같이  변경했다.

vim /etc/systemd/system/uwsgi.service

==== uwsgi.service ====
[Unit]
Description=uWSGI Emperor service
After=postgresql.service

........
================

After 를 이용해서 "postgresql.service" 가 동작하고 나면 이 서비스가 동작하도록 설정했다. 

이 설정후 정상적으로 웹서버가 동작하는 것을 확인 했다. 

뭔지 모르겠지만 Ubuntu 버전, 클라우드 종류 이런 것들에 따라서 Ubuntu 가 다양하게 변경되어 배포되는 것 같다. 그래서 이번 PC는 서버 Ubuntu 가 아닌 데스크탑 Ubuntu를 설치해서 이런 문제를 겪는 것 같다. 

 오늘 javascript 을 사용하다가 dict을 for 문으로 돌리는데 key 가 number 가 아니라 계속 string type으로 유지되는 현상을 발견했다. 처음에는 내가 사용한 Object.entries 의 특성인지 알고 다른 방법들을 사용해 보았다. 그러다 검색을 통해 javascript 에서 dictionary 의 key는 자동으로 string 으로 형 변환 된다는 것을 알게 되었다. (참고 : https://stackoverflow.com/a/3633390/6652082

 내가 python 코드를 작성할 때, key 를 integer 를 사용하거나 파이썬은 아래 처럼 key를 tuple(리스트 같은 것이지만 변경이 불가능한 것)로 사용할 수도 있다. 

 a = {(1,2) : "test"}



그렇기에 당연히 javascript 에서도 사용 가능할 줄 알았다.  만약 정말 number 형 key 가 필요하다면 stackoverflow 에서 제시되었듯이 Map() 을 사용해야 한다.

const map1 = new Map();

map1.set(1,3)
map1.set('1','string')

 

javascript 에서 dictionary 가 key 만 사용된다는 것을 이제 알게 되다니, 아직 배워야 할 것들이 너무 많다.