- 投稿日:2020-04-30T16:10:01+09:00
PHPでのMySQL (データベース)接続 PDO
PDOとは
PHP Data Objectsrの略称
PHPからデータベースのアクセスを抽象的にしてくれるものPHPからMySQLに接続するコード例(SELECT文)
<?php $mysql = 'mysql:host=localhost;dbname=xxxxxx,charet=utf8'; //xxxxxx === 自分のmysql中の接続したいデータベース名 $user = 'xxxxxx'; //xxxxxx === 自分のmysqlユーザー名 $passwoad = 'xxxxxx'; //xxxxxx === 自分のmysqlパスワード try { $db = new PDO($mysql, $user, $passwoad); $select = "SELECT * FROM" ; $res = $db->query($select); } catch (PDOException $e) { echo '接続エラー: ' . $e->getMessage(); } ?>
- 投稿日:2020-04-30T15:17:52+09:00
JavaでDB接続をしてみる
JavaでDBを操作するには
Javaで使うMySQLをドライバーを入手し、プロジェクトに追加する
SQLドライバーを入手
以下のURLにアクセスし、
Select Operating System:の下にあるセレクトボックスをPlatform Independentにして
zipをダウンロードし、解凍する。(ダウンロード先はどこでもOK)
SQLドライバー
解凍したら
jarファイルができる。プロジェクトに追加
解凍したSQLドライバーをプロジェクトに追加する。
Eclipseで作ったプロジェクトのWebContent->WEB-INF->libにドラッグ&ドロップ
以下のようになる。
ビルドパスの構成を設定
`
プロジェクト右クリック->ビルド・パス->ビルド・パスの構成を開き、ライブラリタブから外部JARの追加を選択し、先ほどWebContent->WEB-INF->libに追加したjarファイルを選択し、追加させる。
追加させた時の画面が以下の通り。
DBの接続確認
以下の実装でDB接続を図る
DBConnect.javaimport java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBManager { public static Connection getConnection(){ Connection con = null; // 初期化 try{ Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:ポート番号/データベース名","ユーザー名","パスワード"); System.out.println("DB接続成功!!!"); return con; }catch(ClassNotFoundException e){ throw new IllegalMonitorStateException(); // クラスがなかった時の例外処理 } catch (SQLException e) { throw new IllegalMonitorStateException(); // SQLでエラーが起きた時の例外処理 } } }DBConnect.javaClass.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:ポート番号/データベース名","ユーザー名","パスワード"); System.out.println("DB接続成功!!!"); // 成功したら出力するようになっている なくてもOK return con; // 接続結果を返すClass.forName("com.mysql.jdbc.Driver");
Classクラス
クラスクラス・・・w
すべてのクラスのスーパークラスである java.lang.Object クラスにgetClass()というメソッドが実装されており、サブクラスのインスタンス生成時に該当のサブクラスのClass情報をClassクラスのインスタンスとして生成し、保持します。
クラス読み込み用クラスみたいなイメージかな
forName("com.mysql.jdbc.Driver");
()内はクラス名 ここではSQLドライバーを指定している。
forName()することにより、DBドライバクラスがロードされ、staticイニシャライザが実行されます。DBドライバクラスは全て、java.sql.Driverを実装しており、各DBドライバクラスでは、staticイニシャライザでDriverManagerクラスというドライバを管理するクラスにDBドライバクラス自身を登録しに行くという処理を実施しています。
forNameでSQLドライバーを探しに行って勝手に登録してくれるみたい
参考:知ってるようで知らないClassクラス(基本編)以上でDBの接続は完了する。
- 投稿日:2020-04-30T03:30:33+09:00
DB設計でのデータ型の決定方法
そもそもなぜデータ型を指定しないといけないの?
データ型を指定するという事は変数がどのくらいのメモリ領域を必要とするかをDBに教えてあげる行為です。
仮にデータ型を指定する,というプロセスがない場合どうなるでしょうか?
宣言された変数はどんな型のデータが入ってもいいように、一番大きくメモリを使うデータ型の分,メモリを占有します。
ユーザーが少ないWebアプリの場合なら一つ一つのメモリが無駄にスペースを取っていても処理結果の差を感じる事はありませんが,TwitterやYouTube等の大型サービスになっていくと無視できない存在になってきます。
ですので,自分の開発アプリが大規模なユーザーを抱えていくであろう事を期待しつつ,丁寧に一つ一つのカラムにデータ型を記述していきましょう。
とりあえずよく使うデータ型について復習しよう
個人的によくみるデータ型を列挙してみますので復習がてらに確認していきましょう。
データ型 特殊能力 string 文字列(1〜255文字) text 文字列(1〜4294967296文字) integer 整数(4バイト) bigint 整数(8バイト) 上記のデータ型だけマスターすればもう貴方はデータ型マスターです。
さよならバイバイして旅に出た甲斐がありました。お疲れ様です。文字列,整数の長さによってデータ型を選択しないといけないので,それぞれの注意点について解説します。
文字列
これに関してはあまり深く考えなくても大丈夫です。
単語の記入を促す場合はstringを使用する。
文章の記入を促す場合はtextをしようして下さい。
日本語ならピカソのフルネームでもstringで格納できるのでnameカラムの場合もstringでLGTMです。
整数(重要)
半角数字の場合,integerは8桁,bigintは16桁まで格納できます。
クレジットカードの番号は8桁超えるのでbigintで登録して下さい。
※これを伝えたかったまた,idも将来的にユーザーが増えると膨大な桁数になる可能性があります。
railsではデフォルトでbigintになっているので,bigintをチョイスする事をお勧めします。参考文献
Ruby on Rails のドキュメント
https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_column
- 投稿日:2020-04-30T00:05:53+09:00
docker-composeでアプリサーバーコンテナからMySQLサーバーコンテナに接続する。
実行環境
Docker for Mac
Docker version 19.03.8簡単な事だけどかなり手こずったのでまとめ。
Dockerfile
FROM ruby:2.7.1-buster RUN gem install rails # node.jsをインストール RUN apt-get update && \ apt-get install -y node.js # yarnをインストール RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && apt-get install -y yarn RUN rails webpacker:install RUN yarn install --check-files COPY Gemfile /Gemfile COPY Gemfile.lock /Gemfile.lock RUN bundle install *開発環境には node.js、 yarn、 webpackerのインストールが必要なので先にインストールしておく。docker-compose.yml
version: "3" services: mysql: image: mysql:8.0.20 command: --default-authentication-plugin=mysql_native_password environment: MYSQL_ROOT_PASSWORD: root app: build: . volumes: - ".:/app" ports: - "3000:3000" tty: true depends_on: - mysql working_dir: "/app"これらを元にdocker-composeでコンテナを立ち上げていきます。
$ docker-compose up立ち上がったらコンテナ内にアクセス。
$ docker exec -it (立ち上げたコンテナのNAMES) /bin/bashmariadb-clientをインストール
$ apt install mariadb-clientmysqlにアクセス
$ mysql -u root -proot -h mysql * docker-compose.yml参照 -u = ユーザーを指定 -p = 指定したユーザーのパスワード -h = ホスト、mysqlコンテナの名前?MySQL [(none)]> *アクセス成功一度ログアウトしconfig/database.ymlを編集します。
具体的にはdatabaseがsqliteになっていたのでmysql2に変更します。# SQLite. Versions 3.8.0 and up are supported. # gem install sqlite3 # # Ensure the SQLite 3 gem is defined in your Gemfile # gem 'sqlite3' # default: &default adapter: mysql2 encording: utf8 username: root password: root host: mysql pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: <<: *default database: rails_development # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: rails_test production: <<: *default database: rails_productionGemfileもsqliteからmysqlに変更
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.7.1' gem 'rails', '~> 6.0.2', '>= 6.0.2.2' # sqliteからmysql2へ gem 'mysql2' gem 'puma', '~> 4.1' gem 'sass-rails', '>= 6' gem 'webpacker', '~> 4.0' gem 'turbolinks', '~> 5' gem 'jbuilder', '~> 2.7' ~省略~$ rake db:create $ mysql -u root -proot -h mysql * もう一度mysqlに接続 $ show databases; * rake db:createが出来ているか確認MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | rails_development | | rails_test | | sys | +--------------------+ 6 rows in set (0.011 sec)一応ここまでやっとけば開発できると思う。完全に自分用で参考にならないかもしれません。
参考: Docker超入門 Part03 - 複数コンテナを動作させる


