DB」タグアーカイブ

MySQLでDB、テーブルを作成する、MacOS BigSur 2020年12月

MySQLのセキュリティ設定している人はここは飛ばす

$マークはMacのターミナルを使用している。
ターミナルは、アプリの「その他」の中にある。(何故かわかりにくいところに入れてある)

mysqlサーバを起動する
$ mysql.server start
Starting MySQL
. SUCCESS!

止めるときは
$ mysql.server stop

次にセキュリティ設定
このサイトを参考にすると良い
https://style.potepan.com/articles/19020.html

MySQLのセキュリティ設定

>>>>>>>>>>>>>>>>>>>以下入力した内容 ここから↓

$ mysql_secure_installation



Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0  >>0:LOWとした。本番環境なら2だ
Please set the password for root here.

New password:   >>パスワードを入れる

Re-enter new password:  >>パスワードの確認

Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.

- Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

 

>>>>>>>>>>>>>>>>>>>>ここまで

mysqlにRootでログインする。

$ mysql -u root -p
Enter password:   >>先程登録したパスワード
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.22 Homebrew

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

 

exitで抜ける
mysql> exit
Bye

ユーザの作成・削除

user:maseda
pass:Test1030 >>ここのパスワードは知られても気にしない。このパスワードを他で使わないから。

ユーザの作成
まずは
rootでログインする
mysql -u root -p
(pass)
以下はmysqlコマンドとして入力する。masedaユーザを作成
一人でしか使わないが、今後誰かと共同作業があるかもしれないので勉強のために
ユーザを作る。

create user ‘maseda’@localhost identified by ‘Test1030’;
作成したユーザの確認

select user, host from mysql.user;

mysql> select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| maseda | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

 

MySQLの設定をしている人はここから作業をする。

root権限でユーザにグローバルレベルでcreate権限を与える。すべてのDBで使える。
制限するときは、DB名を指定するが今はしない。

権限を与える。必要なときに必要な分を与える
grant create on *.* to maseda@localhost;
GRANT SELECT,UPDATE,INSERT,DELETE ON *.* to maseda@localhost;
GRANT DROP,CREATE VIEW,ALTER,EXECUTE,INDEX,SHOW DATABASES,SHOW VIEW,FILE ON *.* to maseda@localhost;

exitでrootを抜ける。

→次はここから、2020/12/15
ユーザでログイン
mysql -u maseda -p
psssはTes*****にした。上に記載。このパスワードはデモ用なので知られてOK

次にデータベースを作成して、テーブルを作る。
そしてCSVファイルを読み込む

自動採番の例 auto_increment
>>create table staff(id int auto_increment, name varchar(10), index(id));

今回作成するDB(Stock)とテーブル(Table_StockOption)を作成

株探のオプション記事の数値をDB化する。
作成の例
DB:Stock
Table:Table_StockOption
・カラム
ID:id , int auto_increment、自動採番
出来高1 Volume1
前日比1 Change1
価格1 Price1
行使価格 ExercisePrice
価格2 Price2
前日比2 Change2
出来高2 Volume2
月限 Month , 例 12月限 12
取引日付、株探掲載日付 OptionDate ,date , DATE(NOW()) >> 2014-01-15
テーブル取り込み作成日 CreateDate ,datetime, NOW() >>2014-01-15 17:05:43
予備 (テキスト),text

//正負を表す ‘-‘ や ‘+’ を記述することができる。+10の+記号はINT型で可能
挿入時は+記号はない。10となり、マイナスは-10となる
NULLは処理速度が遅くなるのでできるだけ使わない。空にしたくないなら-1とか’unknown’とか入れる
大量のデータがないときはそれほど考慮しなくてよいだろう。

・ユーザはmaseda

・DBを作成
CREATE DATABASE Stock DEFAULT CHARACTER SET utf8mb4;

・DBを指定する
use Stock;

・テーブルを作成
CREATE TABLE Table_StockOption(
ID int(11) NOT NULL AUTO_INCREMENT,
Volume1 int(11),
Change1 int(11),
Price1 int(11),
ExercisePrice int(11) NOT NULL,
Price2 int(11),
Change2 int(11),
Volume2 int(11),
Month int(2),
OptionDate DATE,
CreateDate DATETIME,
YOBI text,
PRIMARY KEY (ID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

>>PRIMARY KEY(ID)が必要。ないとエラーになる。

mysql> show tables;
+-------------------+
| Tables_in_stock |
+-------------------+
| Table_StockOption |
+-------------------+

mysql> show columns from Table_StockOption;
ERROR 1142 (42000): SELECT command denied to user ‘maseda’@’localhost’ for table ‘table_stockoption’
mysql>
この場合権限がないので、権限を与える。
GRANT SHOW DATABASES ON *.* to maseda@localhost;
これでいいはず。もしこれでだめな場合は、必要な権限を与えて。
以下はカラム一覧を表示

mysql> show columns from Table_StockOption;
+---------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+----------+------+-----+---------+----------------+
| ID | int | NO | PRI | NULL | auto_increment |
| Volume1 | int | YES | | NULL | |
| Change1 | int | YES | | NULL | |
| Price1 | int | YES | | NULL | |
| ExercisePrice | int | NO | | NULL | |
| Price2 | int | YES | | NULL | |
| Change2 | int | YES | | NULL | |
| Volume2 | int | YES | | NULL | |
| Month | int | YES | | NULL | |
| OptionDate | date | YES | | NULL | |
| CreateDate | datetime | YES | | NULL | |
| YOBI | text | YES | | NULL | |
+---------------+----------+------+-----+---------+----------------+
12 rows in set (0.01 sec)

 

これでテーブルの作成まで終わった。
次は、株探からコピペしたテキストをCSVファイルに置き換えて
mysqlに取り込む作業。
まずは、PythonでCSVファイルに変更するスクリプトを書く

MacOSX,MacBookProでMySQLをインストール、テーブルの作成手順、忘れないための備忘録

MacOSX,MacBookProでMySQLをインストール、テーブルの作成手順、忘れないための備忘録。
2017/3/1

MySQLのDB領域とDBアカウントを作成
を参考にしました。

MySQLの実行
続きを読む

アイフォンアプリ開発、swif3.0 新しいDB Realmをインストールしてみた

アイフォンアプリ開発、swif3.0 新しいDB Realmをインストールしてみた

SQLiteが主流かと思ったら、新しいDB Realmが便利そうだということで、インストールしてみた
SQLiteがいいのかと思っていたら、どうも新しいDBに移行し始めているらしい。
新しいものは使いにくことがあるけれど、廃れてしまって使われない技術も困るので、新しいDBを使ってみることに。
続きを読む

アイフォンアプリ制作のSQLite3を使ってDB、今日のエラー 

今日のエラー アイフォンアプリ制作のSQLite3を使ってDB、エラー

sqlite3_step エラーで検索して得たネット検索の一部抜粋
実機確認で正常に動作しない場合の対処


databaseName=@”Data.db3″
NSArray *paths = NSSearchPathForDirectoriesInDomains
   (NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDir = [paths objectAtIndex:0];

NSString *dbPath =
  [documentsDir stringByAppendingPathComponent:databaseName];

これでどうでしょうか。

現在のフォルダは・・・/iPhone Simulator/4.1ですのでシミュレータのみになると思います。

www.sqlite.org column
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

NEXT次の対策 

iPhoneアプリ開発、その(81) いくぜ解析SQLiteBooks!

>このブログを参考にさせてもらいました。自分のselect文が間違っている様な気がしてきました。いままで、SQLite3のDBファイルが悪い、間違いと思っていましたが、単に、勘違いをしているように思います。

一旦整理します。

正常にDBからカラム列を取得できていません。
今のところで考えられる原因は、

「DBファイルSQLite3ファイルが正しく作成できていない。」
と考えていました。
他のコードは本を参考にしているし、ほんのソースは実行できている。

では、自分で作成したテーブルを確認します。
現在のテーブルは3つのカラム列があります。
テーブル名はcd
フィールド名はそれぞれ
card_id, fore, back

そこで、セレクト文を以下のようにして、comlumnで取得しようとしました。

(1)select card_id form cd; 1つのカラム列を取得したい
(1-2)select back from cd; 1つのカラム列を取得したい
(2)select card_id,fore,back from cd; 3つのカラム列を取得したい

全部エラーとなってDBから情報を取得できていません。

<検証してみましょう。>

・具体的な指定
(1)select card_id form cd;とした場合
sqlite3_column_int(statement,0);//3つのカラム列の1番目で0

(1-2)select back from cd;とした場合
誤り? sqlite3_column_int(statement,2);//3つのカラム列の3番目で2
正  sqlite3_column_int(statement,0);//3つのカラム列の3番目で2であるが、セレクト文で指定したのは一つなので、0???

(2)select card_id,fore,back from cd;
(1-2)の例で行けば、
ここで、”back”の値を取得したいとすれば、
sqlite3_column_int(statement,2);//3つのカラム列の3番目でセレクト文でカラム列を3つ指定しているので、その指定が、0,1,2とする。

つまり、
sqlite3_column_int(sqlite3_stmt*, int iCol)の
int iColは、セレクト文の指定カラム列から取得したカラム列の順番の番号-1ということでしょうか。

なので、いままで、テーブルに設定されたカラム列の順番をint iColに指定してきました。
そのため、例えば、
(1-2)select back from cd;のように、セレクト文を指定して、これは、指定が1つしかないので、本来は”0”なのですが、テーブルに設定されたカラム列の順番から考えると3-1=2なので

sqlite3_column_int(statement,2);とするとNULLが返ってきて
セレクト文は1つなので、
sqlite3_column_int(statement,0);が正しい。

なのでしょうか?
試してみます。

解答

1.SQLite3のファイルは問題なし。
2.sqlite3_column_int(sqlite3_stmt*, int iCol)の
int iColは、Select文で指定するカラム列を基準に考える。DBのカラム列の順番ではない。
つまり、指定する番号である値をセレクト文に合わせて変更していなかったことが原因であり、勘違いしていたという思い込みでした。
3.思い込みを無くして、正しくAPI、関数を理解しましょう。
4.悩んだところにこだわるのは、1,2日間まで。それ以上は他の部分を先に進めましょう。
  時間のある時にじっくりと調べればよいのです。
  解決しても大局からすれば、ほんの僅かな成果しかありません。
  プログラムは動いてこそ意味があります。プログラムの研究をしているのではありません。動かしたいのです。