DML은 자주 쓰다보니 잊어버리지 않는데 

아무래도 DDL은 빈도가 낮다보니 자주 잊어버린다 😫

 

 


"컬럼 변경하기"

 

 

아래 예시 코드는

WORSHIP 테이블의 version 컬럼을 변경하는 쿼리이다.

 

 

 

 

 

 

컬럼명을 order_version 으로 변경하고

데이터 타입은 INT 로,

NOT NULL 제약을 적용하고 

기본값을 0으로 지정하는 쿼리이다. 

 

 

ALTER TABLE `WORSHIP` 
CHANGE COLUMN `version` `order_version` INT 
NOT NULL 
DEFAULT 0 
COMMENT 'version' ;

 

 

 

마지막에 COMMENT는

컬럼에 대한 코멘트라고 이해하면 되는데

 

ERD 자동화 툴을 사용하면

컬럼의 논리명이 COMMENT에 들어간다.

 

 

 

 

 

 

 

Python으로 DB에 insert 문을 execute 했는데 다음과 같은 에러 로그가 뜬다...

 

# 에러 로그
pymysql.err.DataError: (1406, "Data too long for column 'book' at row 1")

 

DB 스카마가 잘못된 줄 알고 Column 사이즈도 늘려봤지만 여전히 같은 문구의 에러를 출력한다.

 

-- Strict mode 확인하기 

-- MySQL이나 MariaDB에서 데이터 insert 할 때 문제가 되는 부분을 점검하는 걸로 보인다.
-- 아래와 같은 구문을 통해서 현재의 모드를 확인할 수 있다.

select @@global.sql_mode;
+-------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                         |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------+

 

 

 

 

 

 

자세히 읽어보면 테이블로 데이터 전송을 엄격하게하고, 영으로 나누지 못하게하고.. 여러가지 방법으로 보호하나보다. 찾아보니 Data too long~ 에러를 일으키는 원인은 STRICT_TRANS_TABLES 이었다. 과감하게 이 부분을 지운다.

 

 

 set @@global.sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

 

 

이제 insert가 정상적으로 된다!

리눅스 환경이라면 /etc/my.cnf 부분에 접속해서 기본 설정을 직접 바꿔주고 설정을 적용하여 실행하게 하는 것도 방법이다.

 

 

 

 

 

 

import pymysql.cursors

conn = pymysql.connect(
        host='aaaicu.synology.me', # MariaDB 서버
        user='dev_kyome',  # MariaDB 아이디
        password='password', # MariaDB 비밀번호
        db = 'database_name', # MariaDB 데이터베이스명
        charset='utf8' )
        
        

 

 

 

Python으로 MariaDB에 연결하려하니 콘솔에 아래와 같은 에러로그를 출력한다.

 

 

#에러 로그
pymysql.err.OperationalError: (1044, "Access denied for user 'dev_kyome'@'%' to database 'database_name'")

 

 

 

 

 

 

 

dev_kyome라는 계정이 데이터베이스에 접근할 권한이 없기 때문이다.

 

 

 

-- dev_kyome 사용자에게 권한을 부여한다.
-- GRANT ALL PRIVILEGES ON ~~로 해서 전체 권한을 줄 수도 있지만,
-- 개발용 계정이 너무 많은 권한을 갖고 있을 필요가 없기 떄문에 DML만 주기로 했다.

GRANT DELETE, INSERT, SELECT, UPDATE ON database_name.* TO `dev_kyome`@`%` IDENTIFIED BY 'password';

-- `dev_kyome`@`%`  에서 @ 뒤는 접속하는 호스트를 말하는데, 
-- 외부에서 접속해서 조작할 수 있는 권한을 주기 위해서 
-- %로 외부에서 접속할 수 있게 설정해주었다.



-- 권한 확인하기 
SHOW GRANTS FOR 'dev_kyome'@'%';

-- 'dev_kyome'@'%' 설정했던 호스트를 입력해야지만 확인 가능하다.

+-------------------------------------------------------------------------------------------------------------+
| Grants for 'dev_kyome'@'%';                                                                                 |
+-------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dev_kyome'@'%' IDENTIFIED BY PASSWORD 'password'                                     |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `database_name`.* TO 'dev_kyome'@'%'                                |
+-------------------------------------------------------------------------------------------------------------+

 

 

 

 

 

데이터를 한번에 insert 하기위해 Python으로 MariaDB의 root 계정에 연결을 시도했다.

 

import pymysql.cursors

conn = pymysql.connect(
        host='aaaicu.synology.me', # MariaDB 서버
        user='root',  # MariaDB 아이디
        password='password', # MariaDB 비밀번호
        db = 'database_name', # MariaDB 데이터베이스명
        charset='utf8' )

 

그런데, 다음과 같은 에러 로그가 출력되었다.

 


pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'000.000.000.000' (using password: YES)")

 

 

 

 

 

root 계정접속이 외부호스트에서 막혀있기 때문이다.

액세스할 수 있도록 호스트를 설정해주지 않으면 localhost만 허용되기 때문에 외부에서 접속가능한 계정을 만들어 주거나 root의 설정을 수정을 해주어야한다

 

 

계정 생성하기

나는 root의 계정을 열어주기보단 외부에서 접속할 수 있는 계정을 열어 줄 생각이다.

create user `dev_kyome`@`%` identified by 'password';

‘생성할 계정명’@‘접속 호스트’ 로 생성 하면된다.

접속 호스트는 특정 IP를 입력해도 되고 도메인명을 입력해도 된다.

외부 어디서든 접속 가능하도록 만드려면 %를 입력하면 된다.

 

 

 

 

 

 

+ Recent posts

"여기"를 클릭하면 광고 제거.