반응형

모든 서비스 클라우드에서 구동하기를 해보려고, 이번엔 Database를 찾고 있습니다. 이번에도 역시 무료가 어느정도 가능한 서비스를 찾다보니 CockroachDB라는 것을 찾게 되었습니다.

 

 

Cockroach Labs, the company building CockroachDB

 

Cockroach Labs, the company building CockroachDB

CockroachDB is a distributed database with standard SQL for cloud applications. CockroachDB powers companies like Comcast, Lush, and Bose.

www.cockroachlabs.com

 

Cockroach라면 우리말로 바퀴벌레인데요, 단어를 알게되는 순간 이미지가 급 안좋아지는데 이 또한 의미가 있다고 하네요. 뭐냐하면 CockroachDB는 시스템에 크고 작은 문제가 생겼을 때 생존하고 스스로 회복하는 것 (Resiliency) 에 가장 큰 강점을 두고 있다고 합니다. 분산 시스템을 설계할 때에 가장 어려운 문제 중 하나가 바로 장애 상황에서 일관성이나 가용성을 최대한 유지하면서 복구해내는 것인데요. 특히 분산 데이터베이스 시스템의 경우 복구에 많은 시간이 걸리거나 많은 데이터가 소실되면 어플리케이션에 큰 영향을 끼칠 수 있습니다.

 

CockroachDB의 경우 디스크, 물리적 머신, 심지어 데이터 센터 단위의 장애가 생기더라도 생존할 수 있는 다양한 옵션을 제공하고 있습니다. 또한 문제 상황이 생기면 스스로 감지하고 사람의 개입 없이도 자동으로 서비스를 최대한 복구해냅니다. 정말 계속해서 나타나는 바퀴벌레의 생명력이 생각나네요. 계속해서 잘 살아남이 DB를 유지해주길 바래봅니다.

 

가격정책을 보니까 제가 좋아하는 무료정책이 있습니다. 기간이 나와있지는 않는데, 10GiB의 스토리지와 월 50M 건의 요청 안에서 사용할 시 무료인 것으로 보입니다. 

 

가입과정을 거쳐 진입하면 자체 콘솔화면이 나타납니다. 여기서 우측 상단에 보이는 Create Cluster를 눌러 생성을 시작합니다.

 

다음으로는 Serverless 플랜을 선택합니다. 그리고 아래쪽에 "Start for free"를 눌러 다음을 진행해줍니다. 지금 저는 하나의 무료 cluster를 이미 생성했기 때문에 해당 메뉴가 활성화가 안되네요.

 

제 화면은 아니지만 아래와 같이 Cluster name이 적당히 생성되고, 다음 오른쪽 보라색 생성버튼을 눌러줍니다. 

 

생성되면 접속과 관련된 정보들이 나타납니다. 이 정보는 터미널에서 직접 DB를 관리할 때 필요한 것 같습니다. DBeaver같은 데이터베이스 관리도구를 사용하면 3번의 접속정보 정도만 알아도 사용 가능합니다. 중간에 Database이름, 사용자 이름과 비밀번호를 생성하는 부분이 있는데, 1번만 알려준다고 하니 잊어버리지 않도록 주의하시기 바랍니다. 잊어버리면 새로 생성할 수는 있습니다.

 

아래와 같이 host, port, database, username, password 등 접속정보를 넣고 입력하면 접속이 됩니다.

 

이제 웹상에 데이터 저장이 가능한 내 Postgresql DB가 생성되었습니다. 

 

아래와 같이 입력하여 신규 Table을 생성하고, 데이터를 집어넣어봅시다.

CREATE TABLE MEMO_POST (
	POST_ID integer generated by default as identity,
	TITLE VARCHAR(50),
	CONTENT VARCHAR(50),
	CREATOR VARCHAR(10) ,
	PUBLISH_DATE TIMESTAMP 
);

insert into memo_post values (default,'첫번째포스팅','안녕하세요, 포스팅 테스트1 입니다.', 'wilkyway', CURRENT_TIMESTAMP);
insert into memo_post values (default,'두번째포스팅','안녕하세요, 포스팅 테스트2 입니다.', 'wilkyway', CURRENT_TIMESTAMP);
insert into memo_post values (default,'세번째포스팅','안녕하세요, 포스팅 테스트3 입니다.', 'wilkyway', CURRENT_TIMESTAMP);

select * from memo_post

 

조금 실수가 있어서 첫번째 라인이 지워졌지만.... 데이터 잘 입력되고 확인이 되네요^^

반응형
반응형

Oracle 설치 완료 후 최초 계정 생성 및 최초 테이블 생성하는 방법에 대해 알아보겠습니다.

 

우선 시작->Oracle_Client->SQLPLUS 를 클릭하여 실행합니다. 

1. DBMS 접속하기

Oracle 설치시 SYSTEM계정의 비밀번호를 1234로 설정해 놓았다고 가정할 때 아래와 같이 입력합니다.

> sqlplus Enter user-name: system Enter password: 1234 
Connected to: Oracle Database 11g Express Edition Release ...

2. 사용자 계정 생성

> create user student identified by 1234; 
User created.

3. student 계정에 권한 주기

student계정에 직접 접속하려면 권한이 없다는 에러가 발생합니다. SYSTEM계정으로 우선 연결하여 권한을 부여해줘야 합니다.

>conn student/1234 
-- 에러. 권한 없음 

> conn system/1234 
-- system계정으로 연결 Connected. 

> GRANT connect, resource TO student; Connected. 
-- system계정으로 student계정에게 connect, resource 권한을 준다 

> conn student/1234 Connected. 
-- 접속성공

4. CREATE로 테이블 생성

CREATE TABLE명령어로 member, Customer 등 테이블을 생성할 수 있습니다.

CREATE TABLE member( 
id NUMBER(5), 
name CHAR(25), 
salary NUMBER(7,2), 
title CHAR(25) default '사원', 
in_date DATE default SYSDATE, 
dept_name CHAR(25) 
);

Table member(가) 생성되었습니다.
CREATE TABLE Customer ( 
sid integer PRIMARY KEY, 
last_name VARCHAR(30), 
first_name VARCHAR(30) 
);

 


이상 간단하게 계정 생성/권한부여/테이블 생성에 대해 알아보았습니다.

 

~~~끝~~~

반응형
반응형

아...힘든 하루네요.

회사에서 쓰는게 oracle 11g 2Release 32bit라서 이걸 모델로 집에서 django랑 연동 테스트 해보려고 삽질을 시작했는데... 오전 9:30분에 시작해서 지금, 오후 10:00에서야 드디어 완성했습니다. 그것도 완전한 완성이라고 볼 순 없고 부분적으로 모자란 부분이 있습니다.

 

오늘 최종적으로 성공한 각 프로그램/모듈의 버전은 아래와 같습니다.

  oracle 11g 2Release 64bit

  Python 3.6.1 64bit

  Django 1.11.22

  cx_Oracle 6.3

 

32비트고 뭐고 왔다갔다 하느라 정신없어서..64비트로 우선 통일!

안되는 영어로 계속 뒤져보니까 요즘나오는 Django 3.0이나 2.X대 버전은 oracle 11g를 지원을 안한다고 합니다. 가능한 버전이 Django 1.11.XX대 버전이라고 합니다. 문제는 얘도 Python 버전을 가리는데..최신 3.8은 안되고 2.7 ~ 3.6 까지만 된다네요.... 버전맞추기 참 힘듭니다. cx_Oracle은 나중에 알아보니 그냥 최신 깔아도 될 것 같습니다. 여기까진 그냥 고생한 내용이고..

현재는 버전에 크게 상관없이 잘 구동이 됩니다.

 

Django와 Oracle 연동하는 방법을 알아보겠습니다. 피곤해서 캡쳐는 생략하겠습니다. (나중에 시간나면 업뎃하는걸로..)

 

1. 버전 확인. 오라클과 연동할 때 같은 32bit 또는 64bit인지 꼭 확인합니다.

=> 64bit를 기본으로 깔면 32bit와 연동할 때에도 큰 문제없이 가능합니다.

 

2. oracle 11g와 연동할 django 1.11.22버전 설치합니다.

  - pip install django~=1.11.22

(특정 버전을 골라 설치하려면 이렇게 해도 되지만, Django 3.0부터는 ASGI를 지원하므로, 굳이 구버전을 설치할 필요는 없습니다.)

 

3. DB연동을 위한 cx_Oracle을 설치합니다.

  - pip install cx_Oracle

 

4. 프로젝트 생성

  - django-admin startproject mysite (새로 생성되는 mysite폴더에 manage.py가 생성됩니다. 귀찮아짐..)

  - django-admin startproject mysite . (마지막에 . 을 찍어주면 현재 폴더에 manage.py가 생성됩니다.)

 

5. 앱 생성

  - python manage.py startapp polls

 

6. Database 접속정보 수정

 

 

 

7. inspectdb를 이용하여 models.py생성

  - python manage.py inspectdb test>polls/models.py

  - error발생 가능: TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

  - Django 버전을 꼭 확인하시기 바랍니다. Django 2.0이상 버전은 oracle11g와 안맞는다네요...가끔 했다는 분들도 계신데, 그냥 고수이신걸로...ㅠㅜ

 

8. python manage.py migrate --fake-initial (기존 Oracle 데이터가 있을 경우 불요)

  - error발생 가능: django.db.utils.DatabaseError: ORA-00955: name is already used by an existing object

  - 최초 migration한 파일이 남아있을 수 있으니 지우고 다시

    python manage.py makemigrations 와

    python manage.py migrate --fake-initial 수행하고 진행하시기 바랍니다.

  - Database 테이블이 초기화 상태이어야 합니다. 데이터가 있으면 이 에러메시지가 발생합니다. 좀 이상한데,, 데이터가 존재하는 경우 연동을 어떻게 시키는지 아시는 분께서 답글좀 달아주시면 정말 감사하겠습니다.

 

오전 9시30분부터 시작해서 저녁 10:00 완료하기까지 알아낸 것 치고는 별거 없네요...

Python, Django, Oracle 버전 맞춘다고 지웠다 깔았다 계속하고, 특히 오라클 지우고 3번 다시 까느라 시간 다 보내고,

Django가 쉽다는데.....너무 어렵게 시작하는 것 같은...

 

 

 

그럼 이만~

 

(ps) 2020.06.03: 기존 오라클의 데이터가 있을 경우 makemigrations와 migrate는 없어야합니다. DB정보만 잘 입력해주면, 그리고 inspectdb만 잘 끌어오면 기존 데이터는 접근 가능합니다.

 

(ps) 2021.11.19: 특정 테이블만 가져오기

# python manage.py inspectdb --database=디비명 테이블명1 테이블명2 > 폴더이름/models.py 

python manage.py inspectdb --database=default TEMP TEMP2 > ./models/models.py

 

반응형
반응형

Python로 Oracle Database에 연결하기 위해서는 cx_oracle 모듈을 설치해야 합니다.

 

설치 방법은 어렵지 않은데 Pycharm과 일반 커맨드창 파이썬에서 실행하는 방법을 나눠 설명하겠습니다.

 

1. 우선 주로 쓰는 Pycharm에서는 File - Settings - Project - Project Interpreter 로 진입합니다. 그리고 cx_Oracle 모듈을 찾아서 설치해 줍니다.

 

cx_Oracle 모듈을 찾아 설치한다.

 

 

 

모듈 설치하고 난 모습

 

2. Command창에 설치해서 사용하는 경우라면,

sudo pip install cx_oracle

로 설치할 수 있습니니다.

 

3. Oracle Client 설치

cx_Oracle을 사용하려면 Oracle Client를 설치해주어야 합니다. Oracle이 설치되어있어도 Library 때문에 필요한 것으로 보입니다. 설치 경로는 여기를 참조하세요.

설치가 다 끝나면 코드 내부에서 해당 라이브러리를 사용하도록 경로를 설정해줍니다. (Path에 추가해주면 된다고 하는데, 잘 안되서 직접 경로를 넣어줬습니다. 이방법이 제일 확실히 되는 것 같습니다.)

cx_Oracle.init_oracle_client(lib_dir=r"D:\8_Programs\Oracle\instantclient_19_9")

 

4. DBconn.py (DB Connection Sample)

import cx_Oracle
import os


#한글지원방법
os.putenv('NLS_LANG', '.UTF8')

# 함수 정의
def connect():
	#라이브러리 연결
    cx_Oracle.init_oracle_client(lib_dir=r"D:\8_Programs\Oracle\instantclient_19_9")
    
    con_ip='localhost:1526/testdb'
    con_id='user'
    con_pw='password'
 
    #연결에 필요한 기본 정보(유저, 비밀번호, 데이터베이스 서버 주소)
    connection = cx_Oracle.connect(con_id,con_pw, con_ip)
    cursor = connection.cursor()
    cursor.execute("""
        select *
        from member
        where name='홍길동'
        """)

    for list in cursor:
        print(list)

    cursor.close()
    connection.close()
    
# 함수 실행    
connect()

 
반응형
반응형

JOIN은 각 테이블간에 공통 조건으로 데이터를 연결하여 표현하는 것입니다.

기본 4가지 Join방법에 대해 도식과 함께 기억하면 쉽게 이해하고 현업에서 사용할 수 있을 것입니다.

 

 

1) 기본 조인: 공통 속성이 있는 리스트만 추출

 

 

 

SELECT A.field1, A.field2, B.field3

FROM   Table_A, Table_B

WHERE A.ID = B.ID;

 

 

 

 

 

2) LEFT OUTER JOIN: A 테이블은 모두 나오고, B테이블에 공통값이 없는 경우 NULL값 출력

 

 

SELECT A.field1, A.field2, B.field3

FROM   Table_A, Table_B

WHERE A.ID = B.ID(+); //값이 없을수도 있는쪽에 (+)연산자를 붙인다.

 

SELECT A.field1, A.field2, B.field3

FROM   Table_A LEFT OUTER JOIN Table_B

on A.ID = B.ID;

 

 

 

3) RIGHT OUTER JOIN: B 테이블은 모두 나오고, A테이블에 공통값이 없는 경우 NULL값 출력

 

 

SELECT A.field1, A.field2, B.field3

FROM   Table_A, Table_B

WHERE A.ID(+) = B.ID; //값이 없을수도 있는쪽에 (+)연산자를 붙인다.

 

SELECT A.field1, A.field2, B.field3

FROM   Table_A RIGHT OUTER JOIN Table_B

on A.ID = B.ID;

 

 

 

4) FULL OUTER JOIN: 상대 테이블에 공통값이 없는 경우 NULL값 출력

 

 

 

SELECT A.field1, A.field2, B.field3

FROM   Table_A FULL OUTER JOIN Table_B

on A.ID = B.ID;

 

 

 

 

 

그 외에도 몇가지 조인방법이 있긴 한데, 기본 개념을 이해하면 쉽게 응용 가능한 부분이라 생략하도록 하겠습니다.

 

반응형
반응형

자바로 데이터베이스 연결 프로그램 구현 시, DB연결부 구현파일입니다.

 

package DB;
import java.sql.*;

public class DBConnection
{
  public static Connection dbConn;
  public static Connection getConnection() 
  {
    Connection conn = null;
    try{
        String user="abcd";
        String pw="********";
        String url="jdbc:oracle:thin:@zxcv.dothome.co.kr:1521:odbc";
        //이렇게 해야 연결이 된다. C#과 차이
        Class.forName("oracle.jdbc.driver.OracleDriver");
        System.out.println("driver load success");
        conn=DriverManager.getConnection(url,user,pw);
        System.out.println("DBConnectsuccess");
    }catch(ClassNotFoundExceptioncnfe){
        System.out.println("DB드라이버로딩실패:"+cnfe.toString());
    }catch(SQLExceptionsqle){
        System.out.println("DB접속실패:"+sqle.toString());
    }catch(Exceptione){
        System.out.println("Unkonwn error");
        e.printStackTrace();
    }
    return conn;
  }
}

 

반응형

'Programming > Java_Etc' 카테고리의 다른 글

AWT Study - 팝업메뉴  (0) 2020.02.11
AWT Study - 메뉴 생성  (0) 2020.02.11
AWT Study - Window & Frame  (0) 2020.02.11
Java 막대 그래프 그리기2  (0) 2020.02.08
Database Connection - OracleTest.java  (0) 2020.01.29
반응형

1. DBConnection.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class DBConnection 
{
    public static Connection dbConn;
    
    public static Connection getConnection()
    {
      Connection conn = null;
      try {
        String user = "scott"; 
        String pw = "tiger";
        String url = "jdbc:oracle:thin:@localhost:1521:orcl";

        Class.forName("oracle.jdbc.driver.OracleDriver");        
        conn = DriverManager.getConnection(url, user, pw);

        System.out.println("Database에 연결되었습니다.\n");

      } catch (ClassNotFoundException cnfe) {
          System.out.println("DB 드라이버 로딩 실패 :"+cnfe.toString());
      } catch (SQLException sqle) {
          System.out.println("DB 접속실패 : "+sqle.toString());
      } catch (Exception e) {
          System.out.println("Unkonwn error");
          e.printStackTrace();
      }
    return conn;     
    }
}

 

2. DB 데이터추출 구현부

package DB;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class OracleTest
{
    public static void main(String args[])
    {
        Connection conn = null; // DB연결된 상태(세션)을 담은 객체
        PreparedStatement pstm = null; // SQL 문을 나타내는 객체
        ResultSet rs = null; // 쿼리문을 날린것에 대한 반환값을 담을 객체
        
        try {
          // SQL 문장을 만들고 만약 문장이 질의어(SELECT문)라면
          // 그 결과를 담을 ResulSet 객체를 준비한 후 실행시킨다.
          String quary = "SELECT * FROM (select * from TEMP order by empno) where rownum<=10";
          //String quary = "SELECT * FROM (select * from TEMP order by EMP_#) fetch first 100 rows only";
          conn = DBConnection.getConnection();
          pstm = conn.prepareStatement(quary);
          rs = pstm.executeQuery();
          System.out.println("EMPNO EMP_X KoreanName HanmunName CommonNumber");
          System.out.println("============================================");

          while(rs.next()){
              String empno = rs.getString(1);
              int emp_x = rs.getInt(2);
              String Korean_name = rs.getString(3);
              String Han_name = rs.getString(4);
              int comm = rs.getInt("RES_#1");
              //java.sql.Date hiredate = rs.getDate(5); // Date 타입 처리
              String result = empno+" "+emp_x+" "+Korean_name+" "+Han_name+" "+comm;
              //                      직원번호       구분           한글이름             한문이름        주민번호
              System.out.println(result);
           }
           
        } catch (SQLException sqle) {
        	System.out.println("SELECT문에서 예외 발생");
        	sqle.printStackTrace();
            
        }finally{
        // DB 연결을 종료한다.
            try{
                if ( rs != null ){rs.close();}
                if ( pstm != null ){pstm.close();}
                if ( conn != null ){conn.close(); }
                
            }catch(Exception e){
            	throw new RuntimeException(e.getMessage());
            }
        }
    }
}

 

반응형

'Programming > Java_Etc' 카테고리의 다른 글

AWT Study - 팝업메뉴  (0) 2020.02.11
AWT Study - 메뉴 생성  (0) 2020.02.11
AWT Study - Window & Frame  (0) 2020.02.11
Java 막대 그래프 그리기2  (0) 2020.02.08
Database Connection - DBConnection.java  (0) 2020.01.29

+ Recent posts