본문 바로가기
개발 공식/Database

Mysql 서버에 DB이름이 존재하는지 확인하기

by JinCoding 2022. 4. 26.
반응형

많은 사람들이

서버 접속을 Database가 있다는 가정하에

바로 Connection 한다.

때때로, 서버에 DB가 존재하지 않을 수도 있고

존재하지 않으면 동적으로 생성하고

존재하면 그대로 쓰는 코드가 필요한데

구글링을 해도 절~대 안나오더라

 

너무 화가 났지만 ^^

침착하게 만들었다.

 private const string server_path = "Server=서버주소;Port=포트번호;Uid=아이디;Pwd=비밀번호;";
		
        public static string Check_db_server_connection(string db_name) // 파라미터 db_name은 서버에 존재 혹은 생성할 Database 이름
        {
            using var conn = new MySqlConnection(server_path);
            conn.Open();
            if (conn.State == ConnectionState.Open) // 서버와 정상적으로 연결됐는지 확인
            {
                var cmd = conn.CreateCommand();
                cmd.CommandText = "SHOW DATABASES"; // 서버에서 데이터베이스를 가져오기
                var reader = cmd.ExecuteReader();
                var db_name_list = new List<string>(); // 이름을 담아 둘 리스트 생성
                while (reader.Read())
                    for (var i = 0; i < reader.FieldCount; i++)
                        db_name_list.Add(reader.GetValue(i).ToString()); // 이름만 리스트에 추가
                reader.Close();

                var matching_database = db_name_list.SingleOrDefault(x => x.Contains(db_name)); // 파라미터로 가져온 Database이름과 같은 게 있는 지 확인

                if (matching_database is null) // 같은 게 없다면 새로 생성 후 주소반환
                {
                    cmd.CommandText = $"CREATE DATABASE IF NOT EXISTS {db_name};";
                    cmd.ExecuteNonQuery();
                    conn.Close();
                    return server_path + $"Database={db_name};";
                }
                else
                {
                    conn.Close();
                    return server_path + $"Database={matching_database};"; // 같은 게 있다면 해당 이름으로 주소반환
                }
            }
            else
            {
                return null;
            }
        }

필자는 Entity Framework를 사용하기 때문에

서버 주소 값을 리턴 받는다.

 

new MySqlConnection(server_path)에서

server_path에 db 주소를 포함하지 않고

서버에만 로그인 한 후,

커맨드라인 명령어로 데이터베이스 목록을 받아온다.

목록에서 이름값만 반복문을 돌려

임시 list에 담아둔 후,

파라미터로 받아온 db_name과 일치여부를

확인한다.

이후엔, 생성할 건지 그대로 쓸건지 결정

 

애진작에 직접 만들걸 그랬다.

구글링하는데 하나 같이 복사붙쳐넣기 한거 처럼

똑같은 case로 설명하는데

내가 찾는 상황은 없더라

이래서 응용이 중요함

반응형

댓글