20201108のMySQLに関する記事は9件です。

Mysqlで、テーブル内のデータを消したいときあ

本記事の内容

特定のテーブルないのデータを消すだけです。
カラムやテーブル、DBを削除する方法ではありません。

方法

以下は全てターミナルで行う動作です。

1 mysql -u root でmysqlにログイン。

2 use DB名 で、扱いたいデーターベースを指定する。

3 delete from テーブル名; で、データを削除。テーブル名は削除したいータがあるテーブル名を指定。

(4) ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`DB名`) 

もしも、上記のようなエラーが出たら、これはそのテーブルと他のテーブルで外部キーを使用しているので、削除ができないという表示です。
その時は、set FOREIGN_KEY_CHECKS=0;と入力し、一旦外部キー制約を無効にします。
その上で、もう一度3の動作を行ってください。
Query OK, 8 rows affected (0.00 sec) が表示されたら、削除に成功しています。
その後、以下のコマンドで、再び外部キー制約を有効にします。
set FOREIGN_KEY_CHECKS=1;

以上で、データの削除は完了です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mysqlで、テーブル内のデータを消したいとき

本記事の内容

特定のテーブルないのデータを消すだけです。
カラムやテーブル、DBを削除する方法ではありません。

方法

以下は全てターミナルで行う動作です。

1 mysql -u root でmysqlにログイン。

2 use DB名 で、扱いたいデーターベースを指定する。

3 delete from テーブル名; で、データを削除。テーブル名は削除したいデータがあるテーブル名を指定。

(4) ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`DB名`) 

もしも、上記のようなエラーが出たら、これはそのテーブルと他のテーブルで外部キーを使用しているので、削除ができないという表示です。
その時は、set FOREIGN_KEY_CHECKS=0;と入力し、一旦外部キー制約を無効にします。
その上で、もう一度3の動作を行ってください。
Query OK, 8 rows affected (0.00 sec) が表示され、削除に成功しています。
その後、以下のコマンドで、再び外部キー制約を有効にします。
set FOREIGN_KEY_CHECKS=1;

以上で、データの削除は完了です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pytest-dockerでデータベースをfixtureする

「データベースをDockerでfixtureするpytest環境例」として次を用意した。

こちらの記事はMySQLだったがPostgreSQLでも確認してみた。

なお、データベース接続インターフェースのライブラリーとして、

を利用したが、他のものを利用する場合もほぼ同じだと思う。

conftest.py の fixture例

pytest-dockerのサンプルでhttpbinの起動待ちしているところ、

def is_responsive(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return True
    except ConnectionError:
        return False


@pytest.fixture(scope="session")
def http_service(docker_ip, docker_services):
    """Ensure that HTTP service is up and responsive."""

    # `port_for` takes a container port and returns the corresponding host port
    port = docker_services.port_for("httpbin", 80)
    url = "http://{}:{}".format(docker_ip, port)
    docker_services.wait_until_responsive(
        timeout=30.0, pause=0.1, check=lambda: is_responsive(url)
    )
    return url

これのデータベース版。アプリケーション側ではSQLAlchemy等のORMを使う場合でも直接接続ライブラリーでconnectしてみた。ORM経由だとSQLAlchemyのcreate_engine()のタイミングなのかどうなのかよくわからないし。ドライバーライブラリー経由で接続して起動確認してるってことを明示する感じで。

MySQL container の場合

MySQLコンテナーが立ち上がりconnect()に対してExceptionがでなくなるまで待つ

def is_mysqld_ready(docker_ip):
    try:
        pymysql.connect(
            host=docker_ip,
            user=os.getenv('MYSQL_USER', ''),
            password=os.getenv('MYSQL_PASSWORD', ''),
            db=os.getenv('MYSQL_DATABASE', '')
        )
        return True
    except:
        return False

@pytest.fixture(scope="session")
def database_service(docker_ip, docker_services):
    docker_services.wait_until_responsive(
        timeout=30.0, pause=0.1, check=lambda: is_mysqld_ready(docker_ip)
    )
    return

PostgreSQL container の場合

一緒ですね。

def is_postgresql_ready(docker_ip):
    try:
        psycopg2.connect(
            "postgresql://{user}:{password}@{host}/{db}".format(
                user=os.getenv('POSTGRES_USER', ''),
                password=os.getenv('POSTGRES_PASSWORD', ''),
                host=docker_ip,
                db=os.getenv('POSTGRES_DB', '')
            )
        )
        return True
    except:
        return False
@pytest.fixture(scope="session")
def database_service(docker_ip, docker_services):
    docker_services.wait_until_responsive(
        timeout=30.0, pause=0.1, check=lambda: is_postgresql_ready(docker_ip)
    )
    return

docker-compose.yml

# MySQLの場合
version: "3"

services:
  database:
    image: mysql:5.7
    ports:
      - 3306:3306
    volumes:
      - ./initdb.d:/docker-entrypoint-initdb.d
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
# PostgreSQLの場合
version: "3"

services:
  database:
    image: postgres:13
    ports:
      - 5432:5432
    volumes:
      - ./initdb.d:/docker-entrypoint-initdb.d
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}

スキーマとテストデータの準備

あとはdocker-composeでヴォリュームマウントされ初期化実行される./initdb.d:/docker-entrypoint-initdb.d./initdb.dフォルダにSQLや初期化シェルスクリプトなどを放り込んでおけばテスト可能に。

Qiitaの記事だと、Docker で MySQL 起動時にデータの初期化を行う など。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel-enum:v2の日本語化

laravel-enumのv2の日本語化の書き方が他の記事と違ったので備忘録的に書き残す

環境


% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H2

% docker version
Client: Docker Engine - Community
 Cloud integration: 1.0.1
 Version:           19.03.13
 API version:       1.40

# php -v
PHP 7.4.7 (cli) (built: Jun 11 2020 18:41:17) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans

# php artisan -v     
Laravel Framework 7.26.1

# mysql --version
mysql  Ver 14.14 Distrib 5.7.30, for Linux (x86_64) using  EditLine wrapper

composer require bensampo/laravel-enum:2.2

最初何も考えずにcomposer require bensampo/laravel-enum叩いたら「最新のlaravel-enumはlaravel7.に対応してない」と怒られた
公式docによるとlaravel7.
に対応してるのはbensampo/laravel-enum:2.2らしいのでバージョン指定でcomposer requireする
公式doc読むの大事ほんと

composer require bensampo/laravel-enum:2.2

ここからはv2のdocを参照する

enum定義

enumファイル作成

php artisan make:enum UserType

enum定義

UserType.php
use BenSampo\Enum\Enum;
use BenSampo\Enum\Contracts\LocalizedEnum;

final class UserType extends Enum implements LocalizedEnum
{
    const Administrator = 1;
    const SuperAdministrator = 2;
}

ちなみにmysqlのenum型は0を''として予約されているので1から定義する

日本語化

多言語化のインターフェースを有効にする

# php artisan vendor:publish --provider="BenSampo\Enum\EnumServiceProvider"
Copied Directory [/vendor/bensampo/laravel-enum/resources/lang] To [/resources/lang/vendor/laravelEnum]
Publishing complete.

resouces/ja配下にenums.phpを作成して定義

resources/lang/ja/enums.php
<?php

use App\Enums\UserType;

return [

    UserType::class => [
        UserType::Administrator => '管理者',
        UserType::SuperAdministrator => 'スーパー管理者',
    ],

];

これで日本語化されます

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails/AWS】RDSのMySQLに繋がらないエラーの考えられる原因(database.yml)

はじめに

本記事は、RailsアプリをAWSにデプロイした際に発生する可能性のある
MySQLに繋がらないという事象に対する原因例を紹介します。
原因はかなり初歩的な原因でしたが、筆者はこのエラー原因が特定できずとても苦労したため、
今後同じエラーに遭遇した方の助けになれば幸いです。

開発環境

  • Ruby 2.5.1
  • Rails 5.2.4.4
  • AWS(EC2, RDS)
  • MySQL(RDS) 5.6.48

前提条件

  • RailsアプリをEC2のWebサーバー上にgitクローン済み。
  • 基本的な設定は完了済みで、rake db:create RAILS_ENV=productionのコマンドを実行する手前の状態。
  • RDSのDBインスタンスを作成済み。
  • Railsのdatabase.ymlは下記の内容です。
database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

production:
  <<: *default
  database: データベース名
  host: <%= ENV['DATABASE_HOST_PRODUCTION'] %>
  username: <%= ENV['DATABASE_USER_NAME_PRODUCTION'] %>
  password: <%= ENV['DATABASE_PASSWORD_PRODUCTION'] %>

エラー内容

以下のコマンドだとRDSのMySQLに繋がったのですが・・・・

[ec2-user@ip-10-0-1-10 アプリのディレクトリ]$ mysql -h RDSのエンドポイント -u root -P 3306 -p

以下のコマンドだと繋がらず、MySQLに繋がらないというエラーが出ました。

[ec2-user@ip-10-0-1-10 アプリのディレクトリ]$ rake db:create RAILS_ENV=production
Can't connect to MySQL server on '10.0.1.10' (111)
Couldn't create 'データベース名' database. Please check your configuration.
rake aborted!
Mysql2::Error::ConnectionError: Can't connect to MySQL server on '10.0.1.10' (111)

Tasks: TOP => db:create
(See full trace by running task with --trace)

原因/解決策

当初はホスト名の設定ができていなかったので、エンドポイントを環境変数に入れて修正したのですが、
mysqlコマンドだと繋がるのにrakeコマンドだと繋がらないという謎の現象が発生しました。
いろいろ調べたところ、MySQLのパスワードにパスワードに"#"が入っていることが原因でした。
YAMLファイルはコメントアウトの記法が#ということで、パスワードに"#"が入っているとコメントされてしまいます。
パスワードを変更したら無事rakeコマンドが通りました。
みなさんお気を付けください。

まとめ

MySQLのパスワードに"#'を含めるのは良くない。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

POSTMAN で画像を投稿する

はじめに

これまでテキストデータを投げることばかりしていたので
初めて画像投稿機能をやるときに、ちょっと手こずりました

方法

パラメーターに次のように記載すると出来ました!


パラメーターの名前[要素名]


なので今回は、image[cat_photo]といった具合に記載しました。
下のようにデータ登録した上でSendするといいです。
スクリーンショット 2020-11-08 9.33.48.png
データベースを確認、、、
ない!と思ったら
スクリーンショット 2020-11-08 9.41.02.png
active_storageにきちんと紐づいた形で収まってました。
スクリーンショット 2020-11-08 9.40.13.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ワードプレスのデータをエクスポートする(phpMyAdminがない場合)

ワードプレスのデータベースにあるデータをエクスポートしたい。

でもphpMyAdminがない!!!使えない。

phpMyAdminがあればディレクターや運用者でもデータのエクスポートも簡単なのですが、ない場合・・・。
サーバーを扱うエンジニアに依頼しないといけない。
でサーバーを扱うエンジニアもワードプレスのことなんぞしらないので、結局どうすればよいのか誰もわからない。
そんなとき用にどうすればよいのかメモしました。

まず

ワードプレスのwp-config.phpの情報をもとにその内容をダンプしてください。

これだけでは話が通じれば以下は読まなくてOKです。

少し詳しくメモします。

wp-config.phpの内容が以下とします。
// ** MySQL 設定 - こちらの情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'test_wp');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'abcde');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', '44444');

/** MySQL のホスト名 */
define('DB_HOST', 'mysql725.db.〇〇〇.ne.jp');

/** WordPress のためのデータベース名 */
define('DB_NAME', 'test_wp');

$table_prefix  = 'wp_';

特定のプレフィックスを持つテーブルのダンプ($table_prefixの値)をする

※サーバー名やユーザー名、パスワードなどはwp-config.phpの内容で適時置き換えてください。

①テーブル名がwp_から始まるテーブル名をtable.txtに出力する($table_prefixの値)

mysql -u abcde -p -h mysql725.db.〇〇〇.ne.jp -N information_schema -e "SELECT table_name FROM tables WHERE table_schema='test_wp' AND table_name LIKE 'wp_%'" > tables.txt

② ①で作成したtable.txtをもとにエクスポートしたデータを dump.txtに出力する

mysqldump -u abcde -p -h mysql725.db.〇〇〇.ne.jp test_wp `cat tables.txt` > dump.txt

※グーグルで 「mysql ダンプ」 で検索すると一番上にでてくる方法
mysqldump -u abcde -p -h mysql725.db.〇〇〇.ne.jp test_wp > dump.txt

この方法で取得したダンプファイルを渡されたことがありました。
この方法だとデータベースにあるテーブルのすべてがエクスポートされるのです。
同じデータベースに30個ものワードプレスが同居してたため、その中から必要なワードプレスのデータを抜き出すのに多大な時間がかかったのを覚えています。
なので、次はテーブルプリフィックスが〇〇のもののデータをくださいと言わねば
と心にちかったのです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel MAMPの設定からmigrateまでの手順

環境

・Laravel 6.19.1
・MAMP 5.7

MAMPをインストールし、Webブラウザを立ち上げる

MAMPをインストールし、起動する。
MAMPインストールページ

起動後、「⌘ + ,」を入力し、Preferenceを立ち上げる。
Portsタブを選択し、「Apache Port」と「Nginx Port」を80、「MySQL Port」を3306に変更する。
image.png
OKを選択し、次はMAMPの「Start Servers」をクリックする。
image.png
サーバーが立ち上がると、MAMPのWebページトップに遷移する。
image.png
「TOOLS」タブを選択し、「PHPMYADMIN」を選択する。

データーベース設定を行う

ここから本題のデーターベース設定に移っていく。
まずはデフォルトでは英語の設定になっているので、日本語に設定を行う。
image.png
次に左のサイドメニューから「新規作成」をクリックし、データーベースを作成していく。
image.png
データーベース名を入力し、「作成」をクリックすると、先ほど入力したデーターベース名で新規作成される。

データベース ユーザーの作成

先程作成したデーターベースを選択し、タブの「特権」を選択する。
下に「ユーザーアカウントを追加する」とあるので、クリックする。
image.png
ログイン情報の設定を行う画面に遷移するので、「ユーザー名」と「パスワード」を任意で設定し、
ホスト名を「%」→「localhost」に変更する。
image.png
ページの下の方にいくと、「Check all」とあるので、チェックを入れる。
image.png
右下の「実行」をクリックすると、ユーザーが新規作成される。
image.png
改めて新規作成したデータベースを選択 -> 「特権」をクリックし、作成したユーザーが表示されていればOK。
MySQL側の設定はこれで完了。

Laravel データベース設定

VSCodeなどのエディタを使い、環境設定ファイル(.envファイル)を開く。
image.png
画像に基づき、必要な情報を入力していく。

database.phpの設定。

次に、データベース設定ファイル( config > database.php )を開く。
46行目あたりから、mysqlの設定が記載されているので移動してください。

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],

デフォルトでは'unix_socket' => env('DB_SOCKET', ''),となっているのでここを

'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',

に変更する。
この設定を行わないと、$ php artisan migrateコマンドを入力した際にエラーが発生する。(下記参照)

[PDOException]SQLSTATE[HY000] [2002] No such file or directory

php artisan migrate 実行

ここまでの手順を踏み、ターミナルでmigrateコマンドを入力する。

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_18_19_000000_create_failed_jobs_table

このような表示がされれば上手くいっています。
念のため、MAMPのWebページに戻り、新規作成したデーターベースを確認してみましょう。
image.png
このように、テーブルが3つ作成されていれば問題ないです。
今回は以上になります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel MAMPの設定からmigrateまでの手順 [忘備録]

環境

・PHP 7.4.9
・Laravel 6.19.1
・MAMP 5.7

MAMPをインストールし、Webブラウザを立ち上げる

MAMPをインストールし、起動する。
MAMPインストールページ

起動後、「⌘ + ,」を入力し、Preferenceを立ち上げる。
Portsタブを選択し、「Apache Port」と「Nginx Port」を80、「MySQL Port」を3306に変更する。
image.png
OKを選択し、次はMAMPの「Start Servers」をクリックする。
image.png
サーバーが立ち上がると、MAMPのWebページトップに遷移する。
image.png
「TOOLS」タブを選択し、「PHPMYADMIN」を選択する。

データーベース設定を行う

ここから本題のデーターベース設定に移っていく。
まずはデフォルトでは英語の設定になっているので、日本語に設定を行う。
image.png
次に左のサイドメニューから「新規作成」をクリックし、データーベースを作成していく。
image.png
データーベース名を入力し、「作成」をクリックする。
入力したデーターベース名で、左サイドメニューに新規作成されていれば上手くいってます。
次はデーターベースユーザーの作成を行っていきます。

データベース ユーザーの作成

先程作成したデーターベースを選択し、画面右上に表示されているタブの「特権」を選択する。
下に「ユーザーアカウントを追加する」とあるので、クリックする。
image.png
ログイン情報の設定を行う画面に遷移するので、「ユーザー名」と「パスワード」を任意で設定し、
ホスト名を「%」→「localhost」に変更する。
image.png
ページの下の方にいくと、「Check all」とあるので、チェックを入れる。
image.png
右下の「実行」をクリックすると、ユーザーが新規作成される。
image.png
改めて新規作成したデータベースを選択 -> 「特権」をクリックし、作成したユーザーが表示されていればOK。
MySQL側の設定はこれで完了。

Laravel データベース設定

VSCodeなどのエディタを使い、環境設定ファイル(.envファイル)を開く。
image.png
画像に基づき、必要な情報を入力していく。(下記参考例)

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=test_user
DB_PASSWORD=test12345

database.phpの設定。

次に、データベース設定ファイル( config > database.php )を開く。
46行目あたりから、mysqlの設定が記載されているので移動してください。

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],

デフォルトでは'unix_socket' => env('DB_SOCKET', ''),となっているのでここを

'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',

に変更する。
この設定を行わないと、$ php artisan migrateコマンドを入力した際にエラーが発生する。(下記参照)

[PDOException]SQLSTATE[HY000] [2002] No such file or directory

php artisan migrate 実行

ここまでの手順を踏み、ターミナルでmigrateコマンドを入力する。

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_18_19_000000_create_failed_jobs_table

このような表示がされれば上手くいっています。
念のため、MAMPのWebページに戻り、新規作成したデーターベースを確認してみましょう。
image.png
このように、テーブルが3つ作成されていれば問題ないです。
今回は以上になります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む