データベース:データ構造に従ってデータを整理、保存、管理するウェアハウス `
生まれた
コンピュータは科学的計算のために発明されたものであり、科学的計算には多くの入力と出力が必要です。初期には、パンチされたカードの穴と電球のオンとオフを使用してデータの入力と出力を示すことができました。その後、データをテープに順番に保存することができました。テープの読み取りと書き込み。1956年、IBMはランダムアクセスをサポートするディスクドライブの革新的な製品を発明しました。情報時代の到来、ハードウェアストレージテクノロジーの開発に伴い、保存と管理が必要な大量のデータとデータベースがあります。管理。
分類
# データモデルによる分類:
# メッシュデータベース
# 階層データベース
# リレーショナルデータベース
階層データベース
ツリー構造でエンティティとその関係を表します。関係は** 1対多**をサポートします。これはデータベースIMMIMSを表し、交差することはできず、場所によっては非常に適しています。
メッシュデータベース
General Electricは、早くも1964年にメッシュデータベースIDSを開発しました。これは、GE独自のメインフレームでのみ実行できます。
ノードはデータを記述し、ノードの接続はデータの関係です。これは、目的の世界を直接記述でき、階層データモデルでは不可能な、エンティティ間のさまざまな複雑な関係を表すことができます。たとえば、ノードは複数の親ノードを持つことができます。ノード間の多対多の関連付けをサポートします。
リレーショナルデータベース
行と列で構成される2次元テーブルを使用して、データと関係を整理します。テーブル内の行(レコード)は、データエンティティとエンティティ間の関係の両方を記述できます。リレーショナルモデルは、メッシュモデルや階層モデルよりも単純であり、リレーショナルデータストレージを必要としません。データの論理的構築に焦点を当てた物理的略奪、およびリレーショナルモデルは、この論文の厳密なデータ理論基盤によってサポートされています。1970年、IBMの研究者EF Coddは、「大規模な共有データバンクのデータのリレーショナルモデル」と呼ばれる論文を発表しました。リレーショナルモデルの概念が提唱され、リレーショナルモデルの理論的基盤が築かれました。リレーショナルモデルは、厳密なデータ基盤、高い抽象化レベル、シンプルで明確、理解しやすく使いやすいものです。数十年の開発の後、リレーショナルデータベースは繁栄し、テクノロジーが発展しました。成熟した完璧なリレーショナルモデルに基づくデータベースシステムは、RDBMS(Relational DataBase Sytem)になりました。IBMDB2、OracleのOracleとMysql、MicrosoftのMS SQL、以前はInfomix、Sybaseなど。
オラクルの開発
Larry Ellison(Larry EMison)は、IBMのリレーショナルデータベースの論文を注意深く読み、この調査に基づいて開発者がソフトウェアシステムを使用できることに敏感でした。彼らは、汎用の商用データベースシステムOracleを開発することを決定しました。 CIAが行ったプロジェクトの名前。数か月後、彼らはOracle 1.0を開発しました。Oracleはすぐに宣伝されましたが、非常に不安定でした。Oracle7が徐々に安定し、大きな成功を収めたのは1992年のことでした。 9iの2001バージョンは広く使用されています。
2009 2010年4月20日、OracleはSun(Computer Systems)を1株あたり9.50米ドル、合計74億米ドルで買収したことを発表しました。2010年1月に買収に成功しました。2013年、OracleはIBMを上回り、Microsoftに次ぐ世界第2位になりました。ソフトウェア会社。
Mysql開発
1985 いくつかのスウェーデン人は、インデックスを使用してデータに順次アクセスする大規模小売業者のプロジェクト向けのソフトウェアを設計しました。彼はMyISAMの前身でした。1996年にMySQL 1.0がリリースされ、続いてバージョン3.11.1がリリースされ、他のプラットフォームの使用が開始されました。移行、2000年にMySQLはオープンソースにGPL契約を採用し、MySQL 4.0はオープンソースにGPL契約を採用し、MySQL 4.0はMyISAM、InnoDBのサポートを開始しました。2005年10月にMySQL 5.0はマイルストーンバージョンになりました。2008年1月、2009年にSunに買収されました。 OracleがMysqlを買収する前の8月、Monty Wideniusは買収を心配し、Mysql Server 5.5からMariaDBという名前の新しいGPLブランチを開始しました。MySQLのエンジンはプラグインであり、さまざまな種類のエンジンをサポートできます。MyISASMはトランザクションをサポートしていません。挿入、高速クエリ速度。InnoDB、サポートトランザクション、行レベルのロック、Mysql5.5のデフォルトエンジン。
IOEに移動
彼はAlibabaによって作成された概念です。当初の意図は、IBMミニコンピューター、Oracleデータベース、およびEMCストレージデバイスをAlibabaのITアーキテクチャから削除し、オープンソースソフトウェアに基づいて開発されたシステムに置き換えることです。ハイエンドで雰囲気のあるデータセンター、IBMミニコンピューター、Oracleデータベース、EMCストレージデバイスは不可欠であると言えます。これらのアーキテクチャを使用する企業は、メンテナンスコストが非常に高いだけでなく、コアアーキテクチャも他の人の手に委ねられています。
アリババのような大規模なインターネットアプリケーションの場合、オープンソースとオープンシステムアーキテクチャの使用はアリババによって発明されていません。Google、Facebook、Amazonなどの外国企業はすでにそうしていますが、当初はIT商用企業をほとんど採用していませんでした。アーキテクチャなので、「IOEに行く」必要はありません
IOEに移動して安価なアーキテクチャに切り替えると、安定性が確実に低下し、より高いレベルの運用と保守が必要になります。
NoSQL
NoSQLは、非SQL、非従来型のリレーショナルデータベースの総称です。NoSQLという用語は1998年に誕生しました。2009年に、この用語は、非リレーショナル、分散型、およびACIDなしのデータベース設計パターンを指すために再び提案されました。
インターネット時代の到来とともに、データの爆発的な成長とデータベース技術の急速な発展は、新しいビジネスニーズに適応する必要があります。モバイルインターネットとモノのインターネットの出現により、NoSQLはビッグデータの技術においても同様に重要です。
データとは何ですか?
データは事実または観察の結果です。それは客観的なものの論理的な誘導です。それは客観的なものを表すために使用される原材料です。データは情報の現れとキャリアです。それは記号、単語、数字、音声、画像、動画など、データと情報は切り離せません。データは情報の表現であり、情報はデータの意味です。データ自体には意味がありません。データは、エンティティの動作に影響を与える場合にのみ情報になります。コンピュータシステムでは、データはバイナリ情報ユニット0、1の形式で表されます。
データベースは、データ構造に従ってデータを整理、保存、管理するウェアハウスです。
各データベースには、保存されたデータを作成、アクセス、管理、検索、およびコピーするための1つ以上の異なるAPIがあります。
データをファイルに保存することもできますが、ファイル内のデータの読み取りと書き込みの速度は比較的遅くなります。
そこで、今では[リレーショナルデータベース](https://cloud.tencent.com/product/cdb-overview?from=10680)管理システム(RDBMS)を使用して、大量のデータを保存および管理しています。いわゆるリレーショナルデータベースは、リレーショナルモデルに基づいて構築されたデータベースであり、数学的な概念や、セット代数などの方法を使用してデータベース内のデータを処理します。
RDBMSは、リレーショナルデータベース管理システム(リレーショナルデータベース管理システム)の特徴です。
# 1. データは表の形式で表示されます
# 2. 1行あたりのさまざまなレコード名
# 3. 各列は、レコード名に対応するデータフィールドです。
# 4. 多くの行と列がフォームを形成します
# 5. いくつかのフォームがデータベースを形成します
RDBMSの用語
# データベース: データベース是一些关联表的集合。.
# データシート:このテーブルはデータのマトリックスです。データベース内のテーブルは、単純なスプレッドシートのように見えます。
# カラム:一カラム(データ要素)同じデータが含まれています,たとえば、郵便コードデータ。
# 行:1行(=タプル(レコード)は、ユーザーがサブスクライブしたデータなど、関連データのグループです。
# 冗長性:データを2倍保存します。冗長性により、システムを高速化できます。(テーブルの正規化の度合いが高いほど、テーブルとテーブルの間の関係が大きくなります。クエリでは、複数のテーブル間の接続クエリが必要になることがよくあります。接続操作により、クエリの速度が低下します。たとえば、学生情報は学生テーブルに格納され、部門情報は部門テーブルに格納されます。学生テーブルの部門を渡す_idフィールドは、部門テーブルとの関連付け関係を確立します。学生の部門の名前を照会する場合は、学生の部門番号(部門_id)、次にこの番号に従って部門名を見つけます。この操作を頻繁に実行する必要がある場合、接続クエリは多くの時間を浪費します。したがって、冗長なフィールド部門を学生テーブルに追加できます。_name、このフィールドは、学生の部門の名前を格納するために使用されます。このように、毎回接続する必要はありません。)
# 主キー:主キーは一意です。データテーブルには、1つのプライマリキーのみを含めることができます。主キーを使用してデータを照会できます。
# 外部キー:外部キーは、2つのテーブルを関連付けるために使用されます。
# 複合キー:複合キー(複合キー)は、インデックスキーとして複数の列を使用し、通常、複合インデックスに使用されます。
# インデックス:インデックスを使用して、データベーステーブルの特定の情報にすばやくアクセスします。インデックスは、データベーステーブルの1つ以上の列の値を並べ替えるための構造です。本のカタログに似ています。
# 参照の整合性:参照の整合性では、存在しないエンティティが関係に許可されていない必要があります。エンティティとの整合性は、リレーショナルモデルが満たさなければならない整合性制約条件であり、目的はデータの整合性を確保することです。
リレーショナルデータベース:データベースにはテーブルがあり、いくつかのテーブルは関連していて、リレーショナルデータベースと呼ばれる共通の列があります。
Oracle<1521>,DB2<5000>,Mysql,Mariadb<3306>,SQLServer<1433>
> 非リレーショナルデータベース:通常、キーに基づいています-値形式で保存され、SQLステートメントをサポートせず、テーブル構造がなく、構成が単純で、学習コストが低く、Mysql中間層として使用できます。:
```python
# 1. キー値ストレージ:Redis <6379> Memcached <11211>。他のデータストレージと比較してデータ構造がなく、メモリ内で機能するため、パフォーマンスが高くなります。
# 2. 柱状ストレージ:HBase:
# 3. ドキュメントストレージ:ドキュメント、MongoDB <27017>
分散データベース:シャーディングメカニズムによるデータ配信、各ノードはクライアント要求を受信できます<分散化>そして、グローバルメタデータの一部を保持します.
# Hadoop(HDFS):大容量ファイルストレージ、Apache製品、Javaプログラミングに適しています
# FastDFS(オープンソースソフトウェア):小さなファイルストレージ(ネットワークディスク、短いビデオ、画像)に適しており、高い同時実行性を適切にサポートします。
**Mysqlは、ネットワークアクセスをサポートするリレーショナルデータベース管理ソフトウェアです。デフォルトのサービスポートは3306です。.**MySQL通信はmysqlプロトコルを使用します.データベースはデータのセキュリティと整合性を確保する必要があるため、通常はTCPが使用されます.
Mysqlは最も人気のあるリレーショナルデータベース管理システムであり、MySQLはWebアプリケーションの観点から最高のRDBMSです。(リレーショナルデータベース管理システム:リレーショナルデータベース管理システム)アプリケーションソフトウェアの1つ。スウェーデンのMySQLAB会社によって開発され、現在はOracle会社に属しています。 MySQLはリレーショナルデータベース管理システムです。リレーショナルデータベースは、すべてのデータを大規模なウェアハウスに配置するのではなく、異なるテーブルにデータを格納するため、速度と柔軟性が向上します。
# Mysqlはオープンソースであるため、追加料金を支払う必要はありません。
# Mysqlは大規模なデータベースをサポートします。数千万のレコードを持つ大規模なデータベースを処理できます。
# MySQLは標準のSQLデータ言語形式を使用します。
# Mysqlは複数のシステムで許可され、複数の言語をサポートします。これらのプログラミング言語には、C、C ++、Python、Java、Perl、PHP、Eiffel、Ruby、Tclが含まれます。
# Mysqlは、現在最も人気のあるWeb開発言語であるPHPを適切にサポートしています。
# MySQLは大規模なデータベース、5,000万レコードのデータウェアハウス、32ビットシステムテーブルファイルは最大4GBをサポートし、64ビットシステムは最大8TBのテーブルファイルをサポートします。
# Mysqlは、GPL契約を使用してカスタマイズでき、ソースコードを変更して独自のMysqlシステムを開発できます。
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
# mysql5.7.23バージョンを使用することをお勧めします。以下は5.7.23バージョンを使用します。
yum -y install perl libaio expect
tar xvf mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-server-5.7.23-1.el7.x86_64.rpm \
mysql-community-client-5.7.23-1.el7.x86_64.rpm \
mysql-community-common-5.7.23-1.el7.x86_64.rpm \
mysql-community-libs-5.7.23-1.el7.x86_64.rpm
systemctl start mysqld
changepass(){
sed -i '/\[mysqld]/ a skip-grant-tables'/etc/my.cnf
systemctl restart mysqld
mysql <<EOF
update mysql.user set authentication_string='' where user='root' and Host='localhost';
flush privileges;
EOF
sed -i '/skip-grant/d'/etc/my.cnf
systemctl restart mysqld
yum -y install expect ntp
expect <<-EOF
spawn mysqladmin -uroot -p password "ZHOUjian.20"
expect {"password"{ send "\r"}}
expect eof
EOF
systemctl restart mysqld
}
changepass
# リモートログインを承認する
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'ZHOUjian.21' WITH GRANT OPTION;
FLUSH PRIVILEGES;
ソースコードMysqlをインストールします
#! /usr/bin/env bash
# Author: ZhouJian
# Mail:[email protected]
# Time:2019-9-3
# 説明:CentOS 7 Mysql.tarスクリプトのインストール#これは、コンパイルおよび保守中のコンパイル済みtarパッケージです。
Deplay(){
rpm -e mariadb-libs --nodeps
setenforce 0
systemctl stop firewalld
systemctl enable firewalld
sed -i '/^SELINUX=/ s/enforcing/disabled'/etc/ssh/sshd_config
sed -i '/^GSSAPIAu/ s/yes/no/'/etc/ssh/sshd_config
sed -i '/^#UseDNS/ {s/^#//;s/yes/no}'/etc/ssh/sshd_config
id mysql >/dev/nullif[ $?-eq 0];then
echo "mysql user exist"else
groupadd mysql
useradd -M -s /sbin/nologin mysql -g mysql
fi
if[!-d /usr/local/mysqld ];then
tar xf mysql-5.7.26-bin.tar.xz -C /usr/local/
chown mysql.mysql /usr/local/mysqld/-R
fi
echo "export PATH=$PATH:/usr/local/mysqld/mysql/bin">>/etc/profile
source /etc/profile
cat >/etc/my.cnf <<EOF
[ mysqld]
basedir =/usr/local/mysqld/mysql
datadir =/usr/local/mysqld/data
tmpdir =/usr/local/mysqld/tmp
socket =/usr/local/mysqld/tmp/mysql.sock
pid_file =/usr/local/mysqld/tmp/mysqld.pid
log_error =/usr/local/mysqld/log/mysql_error.log
slow_query_log_file =/usr/local/mysqld/log/slow_warn.log
user = mysql
port =3306
bind-address =0.0.0.0
character-set-server = utf8
default_storage_engine = InnoDB
EOF
ln -s /usr/local/mysqld/mysql/support-files/mysql.server /usr/bin/mysqldctl
mysqldctl start
ln -s /usr/local/mysqld/tmp/mysql.sock /tmp/mysql.sock
mysqldctl restart
sed -i '/\[mysqld]/ a skip-grant-tables'/etc/my.cnf
mysqldctl restart
mysql <<EOF
update mysql.user set authentication_string='' where user='root' and Host='localhost';
flush privileges;
EOF
sed -i '/skip-grant/d'/etc/my.cnf
mysqldctl restart
yum -y install expect ntp
cat >/etc/ntp.conf << EOF
restrict default nomodify
server 127.127.1.0
fudge 127.127.1.0 stratum 10
EOF
systemctl start ntpd ; systemctl enable ntpd
expect <<-EOF
spawn mysqladmin -uroot -p password "ZHOUjian.20"
expect {"password"{ send "\r"}}
expect eof
EOF
mysqldctl restart
}
Deplay
# wgetを使用してyumソースインストールをダウンロードします
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
# yumsourceをインストールします
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
# mysqlをインストールします
yum -y install mysql-server
# Mysqlパスワードを変更する方法は3つあります
# 1. 新しくインストールされたmysqlの一時パスワードは/var/log/mysqld.logから取得できます。
grep "password"/var/log/mysqld.log
[ root@mysql ~]# mysql -uroot -p
Enter password:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'ZHOUjian.22';
# 2. mysqladmin -uroot -p password "Baidu.123.com"
Enter password:
# 3. 実験環境はルートパスワードを知らない操作方法は以下の通りです
sed -i '/\[mysqld]/ a skip-grant-tables'/etc/my.cnf
systemctl restart mysqld
mysql <<EOF
update mysql.user set authentication_string='' where user='root' and Host='localhost';
flush privileges;
EOF
sed -i '/skip-grant/d'/etc/my.cnf
systemctl restart mysqld
mysqladmin -uroot -p password "ZHOUjian.20"
パスワードを入力してください:#ここにEnterキーを押してください
# 4. mariadbパスワード変更
use mysql
UPDATE user SET password=password('ZHOUjian.20') WHERE user='root';
MariaDB [mysql]> flush privileges;
# Mysqlにログインしてパスワードを入力するのが面倒だと感じた場合は、次の方法を使用できます。mysqlでのみデータベースに入力できます。
vim /etc/my.cnf
[ client]
password=admin
user=root
systemctl restart mysqld Or mariadb
次の実験を行う前に、リモートアクセスユーザーにMysqlへのアクセスを許可することを忘れないでください
grant all privileges on *.* to admin@"%" identified by 'ZHOUjian.21' withth grant option;
flush privileges;
# SQL言語は主に、データへのアクセス、データのクエリ、データの更新、およびリレーショナルデータベースシステムの管理に使用され、IBMによって開発され、4つのタイプに分けられます。
# DDLステートメントデータベース定義言語(作成、変更、削除、宣言)
# テーブルの構造、データタイプ、テーブル間の接続と制約、およびその他の初期化作業を定義または変更するために使用されます。これらは主に、テーブルを作成するときに使用されます。
# DMLステートメントデータベース操作言語(選択、削除、更新、挿入)#データベース内のデータを操作するために使用される言語。
# DCLステートメントデータベース制御言語(GRANT、REVOKE、COMMIT、ROLLBACK)
# データベースまたはロールのアクセス許可を設定または変更するために使用されるステートメントは、sysadmin、dbcreator、db_ownerなどによってのみ実行できます。
# DQLステートメントデータベースクエリ言語(選択)
mysqlの使用法についてもっと知りたい場合は、私のmysqlコラムを参照してください。
https://www.cnblogs.com/you-men/tag/Mysql/
Mysqlで定義されているデータフィールドのタイプは、データベースの最適化にとって非常に重要です。.
Mysqlは複数のタイプをサポートしており、大きく3つのカテゴリに分類できます。:実行日/時間と文字列の種類
Mysqlは、すべての標準SQL数値データタイプをサポートします
これらのタイプには、厳密な数値タイプが含まれます(INTEGER、SMALLINT、DECIMAL、NUMERIC),そしておおよその数値タイプ(フロート、リアル、ダブルプレシジョン),キーワードINTはINTEGERの同義語であり、キーワードDECはDECIMALの同義語です。.BLTデータタイプはビットフィールド値を保存し、MyISAM、MEMORY、InnoDB、およびBOBテーブルをサポートします.
SQL標準の拡張として,Mysqlは、整数型TINYINT、MEDIUMINT、およびBIGINTもサポートします。,次の表に、必要な各整数タイプのストレージと範囲を示します。
時間値を表す日付と時間のタイプは、DATETIME、DATE、TIMESTAMP、TIME、およびYEARです。
各時間タイプには有効な値の範囲と"ゼロ"値。MySQLでは表現できない無効な値を指定するときに使用されます"ゼロ"値。
TIMESTAMPタイプには、後で説明する独自の自動更新機能があります。
文字列タイプは、CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、およびSETを参照します。このセクションでは、これらのタイプがどのように機能し、クエリでどのように使用するかについて説明します。
CHARタイプとVARCHARタイプは似ていますが、保存と取得の方法が異なります。それらの最大長と後続スペースが保持されるかどうかも異なります。保存中または取得中にケース変換は実行されません。
BINARYクラスとVARBINARYクラスは、非バイナリ文字列ではなくバイナリ文字列が含まれていることを除いて、CHARおよびVARCHARに似ています。つまり、文字列ではなくバイト文字列が含まれています。これは、文字セットがなく、並べ替えと比較が列値バイトの数値に基づいていることを意味します。
BLOBは、可変量のデータを保持できるバイナリラージオブジェクトです。 BLOBには、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOBの4種類があります。それらは、収容できる値の最大長のみが異なります。
TEXTには、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXTの4種類があります。これらは4つのBLOBタイプに対応し、最大長とストレージ要件は同じです。.
pipコマンドを使用してmysqlをインストールできます-connector
python -m pip install mysql-connector
次のコードを使用してmysqlをテストします-コネクタが正常にインストールされているかどうか:
import mysql.connector
# 上記のコードを実行します。エラーが報告されない場合、インストールは成功しています。
# 注:MySQLがバージョン8.0の場合、パスワードプラグインの認証方法が変更されています。以前のバージョンはmysql_native_passwordであり、
# 8.0 バージョンはcaching_sha2_passwordであるため、いくつかの変更が必要です。
# まず、my.ini構成を変更します。
[ mysqld]
default_authentication_plugin=mysql_native_password
# 次に、mysqlで次のコマンドを実行して、パスワードを変更します。
ALTER USER'root '@' localhost 'IDENTIFIED WITH mysql_native_password BY'new password';
# 次のコードを使用してデータベースに接続できます
import mysql.connector
mydb = mysql.connector.connect(
host = "121.36.43.123"、#データベースホストアドレス
user = "admin"、#データベースユーザー名
passwd = "ZHOUjian.21"#データベースパスワード
# database = "youmen_db"#ここでは、指定したデータベースに直接接続できます。データベースが存在しない場合は、エラーメッセージが出力されます。
) print(mydb)
使用するデータベースを作成する"create database"ステートメント、次は名前付きの若者を作成します_dbデータベース:
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21")
mycursor = mydb.cursor()
mycursor.execute("create database youmen_db")
すべてのデータベースのリストを出力します
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21")
mycursor = mydb.cursor()
mycursor.execute("show databases")for x in mycursor:print(x)('information_schema',)('mysql',)('performance_schema',)('sys',)('youmen_db',)
文法
create table table_name(column_name column_type);
使用するデータテーブルを作成する"create table"ステートメント、データテーブルを作成する前に、データベースがすでに存在することを確認してください,以下は、sitesという名前のデータテーブルを作成します:
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
mycursor.execute("create table sites(name VARCHAR(255),url VARCHAR(255))")
Example1
#! /usr/bin/env python3
#- *- coding:utf-8-*-
# 2020 /2/1220:24import mysql.connector
mydb = mysql.connector.connect(
host='116.196.83.113',
user='root',
passwd='ZHOUjian.20',
database='youmen_db')
mycursor=mydb.cursor()
mycursor.execute("create table student(stu_id INT NOT NULL AUTO_INCREMENT,name CHAR(32) NOT NULL ,age INT NOT NULL,register_date DATE,PRIMARY KEY(stu_id))")
フィールドをNULLにしたくない場合,フィールドの属性をNOTNULLに設定できます。データ操作中にフィールドに入力されたデータがNULLの場合、エラーが報告されます。.
AUTO_INCREMENTは、列を自己インクリメント属性として定義します。これは通常、主キーに使用され、値は自動的に1ずつ増加します。.
PRIMAPY KEYキーワードは、列を主キーとして定義するために使用されます。複数の列を使用して主キーを定義できます。列はコンマで区切られます。.
**テーブルを作成するときは、通常、プライマリキー(PRIMARY KEY)を設定します。"INT AUTO_INCREMENT PRIMARY KEY"主キーを作成するステートメント。主キーの初期値は1で、徐々に増加します。.**テーブルが作成されている場合は、ALTERTABLEを使用してテーブルにプライマリキーを追加する必要があります
# サイトテーブルにプライマリキーを追加します
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
mycursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")
# サイトテーブルを作成していない場合は、次のコードを直接使用して作成できます
mycursor.execute("CREATE TABLE sites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")
挿入データの使用"INSERT INTO"ステートメント:
# INSERTINTOステートメントを使用してデータを挿入します
# サイトテーブルにレコードを挿入します
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="INSERT INTO sites (name,url) VALUES (%s,%s)"
val =("youmen_db","https:/www.youmen.com")
mycursor.execute(sql,val)
mydb.commit()#データテーブルの内容が更新されました。このステートメントを使用する必要があります
print(mycursor.rowcount、 "レコードが正常に挿入されました。")1レコードが正常に挿入されました。
# バッチ挿入ではexecutemany()メソッドを使用します。このメソッドの2番目のパラメーターは、挿入するデータを含むタプルのリストです。
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="INSERT INTO sites (name,url) VALUES (%s,%s)"
val =[("youmen_db","https://www.youmen.com"),("GitHub","https://www.github.com"),("Taobao","https://www.taobao.com"),]
mycursor.executemany(sql,val)
mydb.commit()#データテーブルの内容が更新されました。このステートメントを使用する必要があります
print(mycursor.rowcount、 "レコードが正常に挿入されました。")3レコードが正常に挿入されました。
# データレコードを挿入した後にレコードのIDを取得する場合は、次のコードを使用できます。
# print(mycursor.rowcount、 "レコードは正常に挿入されました。"、mycursor.lastrowid)
# 3 レコードが正常に挿入されました。5
# SELECTステートメントを使用してデータを照会する
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM sites")
myresult = mycursor.fetchall()#fetchall()すべてのレコードをフェッチします
for i in myresult:print(i)('youmen_db','https:/www.youmen.com',1)('youmen_db','https://www.youmen.com',2)('GitHub','https://www.github.com',3)('Taobao','https://www.taobao.com',4)
# 指定したフィールドデータのみを読み取ることもできます
# mycursor.execute( "SELECT * FROM sites")の*を、確認する必要のあるフィールドに置き換えます。複数のフィールドがある場合は、「、」で区切ります。
データの一部のみを読み取りたい場合,fetchoneを使用できます()方法:
# 1つのデータのみをクエリする
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM sites")
myresult = mycursor.fetchone()#fetchall()すべてのレコードをフェッチします
print(myresult)('youmen_db','https:/www.youmen.com',1)
指定された条件でデータを読み取りたい場合は、whereステートメントを使用できます:
# 名前フィールドがyoumen_dbであるレコードを読み取ります。
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="SELECT * FROM sites WHERE name = 'youmen_db'"
# ここで条件検索にワイルドカードを使用できます
# ` sql = "SELECT * FROM sites WHERE url LIKE '%men%'"`
mycursor.execute(sql)
myresult = mycursor.fetchall()for x in myresult:print(x)('youmen_db','https:/www.youmen.com',1)('youmen_db','https://www.youmen.com',2)('youmen_db','https://www.youmen.com',5)
データベースクエリからのSQLインジェクション攻撃を防ぐために、%クエリ条件をエスケープするためのプレースホルダー:
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="SELECT * FROM sites WHERE name = %s"
na =("youmen_db",)
mycursor.execute(sql,na)
myresult = mycursor.fetchall()for x in myresult:print(x)('youmen_db','https:/www.youmen.com',1)('youmen_db','https://www.youmen.com',2)('youmen_db','https://www.youmen.com',5)
ORDER BYステートメントを使用して、クエリ結果を並べ替えることができます。デフォルトの並べ替え方法は昇順で、キーワードはASCです。,降順を設定したい場合は、キーワードDESCを設定できます.
# 名前フィールドのアルファベットの昇順で並べ替えます
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="SELECT * FROM sites ORDER BY name"
mycursor.execute(sql)
myresult = mycursor.fetchall()for i in myresult:print(i)('GitHub','https://www.github.com',3)('GitHub','https://www.github.com',6)('Taobao','https://www.taobao.com',4)('Taobao','https://www.taobao.com',7)('youmen_db','https:/www.youmen.com',1)
降順で並べ替え
# 名前フィールドのアルファベットの昇順で並べ替えます
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="SELECT * FROM sites ORDER BY name DESC"
mycursor.execute(sql)
myresult = mycursor.fetchall()for i in myresult:print(i)('youmen_db','https:/www.youmen.com',1)('youmen_db','https://www.youmen.com',2)('youmen_db','https://www.youmen.com',5)('Taobao','https://www.taobao.com',4)('Taobao','https://www.taobao.com',7)('GitHub','https://www.github.com',3)
クエリするデータの量を設定したいので、渡すことができます"LIMIT"指定するステートメント
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="SELECT * FROM sites LIMIT 3"
# 2番目から最初の3つのレコードを読み取ります
# sql ="SELECT * FROM sites LIMIT 3 OFFSET 1"
mycursor.execute(sql)
myresult = mycursor.fetchall()for i in myresult:print(i)('youmen_db','https:/www.youmen.com',1)('youmen_db','https://www.youmen.com',2)('GitHub','https://www.github.com',3)
レコードの使用を削除"DELETE FROM"ステートメント
# youmen_dbという名前のレコードを削除します
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="DELETE FROM sites WHERE name = 'youmen_db'"
# データベースクエリでのSQLインジェクション攻撃を防ぐために、%sプレースホルダーを使用してdeleteステートメントの条件をエスケープできます。
# sql ="DELETE FROM sites WHERE name = %s"
# na =("youmen_db",)
# mycursor.execute(sql,na)
mycursor.execute(sql)
mydb.commit()print(mycursor.rowcount、 "record delete")3つのレコードが削除されました
# deleteステートメントは慎重に使用してください。deleteステートメントには必ずWHERE条件ステートメントを指定してください。指定しないと、テーブルデータ全体が削除されます。
データベース更新の使用法"UPDATE"ステートメント
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="UPDATE sites SET name = '%ao%' WHERE name = 'ZHOU'"
mycursor.execute(sql)
mydb.commit()print(mycursor.rowcount、 "レコードが変更されました")
# UPDATEステートメントは、WHERE条件ステートメントが指定されていることを確認します。指定されていない場合、テーブルデータ全体が更新されます。
# データベースクエリでのSQLインジェクションを防ぐために、%sプレースホルダーを使用して、更新ステートメントの条件をエスケープできます。
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql ="UPDATE sites SET name = %s WHERE name = %s"
val =("GitHub","ZHOU")
mycursor.execute(sql,val)
mydb.commit()print(mycursor.rowcount、 "レコードが変更されました")
テーブルの使用を削除"DROP TABLE"ステートメント、IF EXISTSキーワードは、テーブルが存在するかどうかを判別し、存在する場合にのみ削除するために使用されます
import mysql.connector
mydb = mysql.connector.connect(
host="116.196.83.113",
user="root",
passwd="ZHOUjian.21",
database="youmen_db")
mycursor = mydb.cursor()
sql = 'DROP TABLE IF EXISTSサイト'#データテーブルサイトを削除します
mycursor.execute(sql)
PyMySQLはPython3にあります.xバージョンのMySQLサービスへの接続に使用されるライブラリであるPython2はmysqldbを使用します.
PyMySQLはPythonデータベースAPIv2に準拠しています.0仕様、純粋なものを含む-PythonMysqlクライアントライブラリ
PyMySQLのインストール****PyMySQLを使用する前に、PyMySQLがインストールされていることを確認する必要があります。
PyMySQLダウンロードリンク:https://github.com/PyMySQL/PyMySQL。
まだインストールされていない場合は、次のコマンドを使用して最新バージョンのPyMySQLをインストールできます。
pip3 install PyMySQL
システムがpipコマンドをサポートしていない場合は、次の方法でインストールできます。:
$ git clone https://github.com/PyMySQL/PyMySQL
$ cd PyMySQL/
$ python3 setup.py install
$#XXはPyMySQLのバージョン番号です
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL*
$ python3 setup.py install
$#これで、PyMySQL *ディレクトリを削除できます
# インストールプロセス中に、エラーメッセージ「ImportError:no modulenamedsetuptools」が表示される場合があります。
# これは、setuptoolsがインストールされていないことを意味します。
# [ https://pypi.python.org/pypi/setuptools]各システムのインストール方法を確認してください。
# Linuxシステムのインストール例:
$ wget https://bootstrap.pypa.io/ez_setup.py
$ python3 ez_setup.py
# データベースに接続する前に、以下を確認してください。
# PythonMySQLdbモジュールがマシンにインストールされています。
Example1:データベースに接続する
import pymysql
# データベース接続を開く
db = pymysql.connect("116.196.83.113","root","ZHOUjian.21")
# cursor()メソッドを使用して、カーソルオブジェクトカーソルを作成します
cursor = db.cursor()
# execute()メソッドを使用してSQLcクエリを実行します
cursor.execute("SELECT VERSION()")
# fetchone()メソッドを使用して、単一のデータを取得します。
data = cursor.fetchone()print("Database version: %s"% data)
# データベース接続を閉じる
db.close()
Database version:5.7.23
データベース接続が存在する場合は、excuteを使用できます()データベース、テーブルのライブラリを作成する方法.
データベースyoumenを作成します_db
import pymysql
# データベース接続を開く
db = pymysql.connect("116.196.83.113","root","ZHOUjian.21")
# cursor()メソッドを使用して、カーソルオブジェクトカーソルを作成します
cursor = db.cursor()
# execute()メソッドを使用してSQLcクエリを実行します
cursor.execute("CREATE DATABASE youmen_db")
データベーステーブルを作成する
import pymysql
# データベース接続を開く
db = pymysql.connect("116.196.83.113","root","ZHOUjian.21","youmen_db")
# cursor()メソッドを使用して、カーソルオブジェクトカーソルを作成します
cursor = db.cursor()
# execute()メソッドを使用してSQLを実行し、存在する場合は削除します
cursor.execute("DROP TABLE IF EXISTS NOTES")
# 準備されたステートメントを使用してテーブルを作成します
sql ="""CREATE TABLE NOTES(
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# データベース接続を閉じる
db.close()
次の例では、SQLINSERTステートメントを使用してNOTESテーブルにレコードを挿入します:
import pymysql
# データベース接続を開く
db = pymysql.connect("116.196.83.113","root","ZHOUjian.21","youmen_db")
# cursor()メソッドを使用して、カーソルオブジェクトカーソルを作成します
cursor = db.cursor()
# cursor()メソッドを使用して操作カーソルを取得します
cursor = db.cursor()
# SQL挿入ステートメント
sql ="""INSERT INTO NOTES(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)VALUES('Mac','DELL',20,'M',2000)"""
try:
# sqlステートメントを実行します
cursor.execute(sql)
# 実行のためにデータベースに送信する
db.commit()
except:
# エラーが発生した場合はロールバックします
db.rollback()
# データベース接続を閉じる
db.close()
Example2****上記の例は、次の形式で記述できます。:
import pymysql
# データベース接続を開く
db = pymysql.connect("116.196.83.113","root","ZHOUjian.21","youmen_db")
# cursor()メソッドを使用して、カーソルオブジェクトカーソルを作成します
cursor = db.cursor()
# cursor()メソッドを使用して操作カーソルを取得します
cursor = db.cursor()
# SQL挿入ステートメント
sql ="INSERT INTO NOTES(FIRST_NAME,\
LAST_NAME,AGE,SEX,INCOME) \
VALUES ('%s','%s',%s,'%s',%s)"% \
(' air','level',21,'M',1999)try:
# SQLステートメントを実行する
cursor.execute(sql)
# sqlステートメントを実行します
db.commit()
except:
# エラーが発生したときにロールバックする
db.rollback()
# データベース接続を閉じる
db.close()
次のコードは、変数を使用してパラメーターをSQLに渡します
..................................
user_id ="test123"
password ="password"
con.execute('insert into Login values( %s, %s)'% \
( user_id, password))..................................
fetchoneを使用したPythonクエリMySQL()単一のデータを取得する方法、fetchallを使用()複数のデータを取得する方法.
**Example3:**NOTESテーブルで給与を照会する(賃金)フィールドが1000を超えるすべてのデータ
import pymysql
# データベース接続を開く
db = pymysql.connect("116.196.83.113","root","ZHOUjian.21","youmen_db")
# cursor()メソッドを使用して操作カーソルを取得します
cursor = db.cursor()
# SQLクエリ
sql ="SELECT * FROM EMPLOYEE \
WHERE INCOME > %s"%(1000)try:
# SQLステートメントを実行する
cursor.execute(sql)
# すべてのレコードのリストを取得します
results = cursor.fetchall()for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 結果を印刷する
print("fname=%s,lname=%s,age=%s,sex=%s,income=%s"% \
( fname, lname, age, sex, income ))
except:print("Error: unable to fetch data")
# データベース接続を閉じる
db.close()
# スクリプトの実行結果は次のとおりです。
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
**更新操作は、データテーブルのデータを更新するために使用されます。次の例では、NOTESテーブルのSEXのフィールドをMとして1ずつインクリメントします。.**Example4
import pymysql
# データベース接続を開く
db = pymysql.connect("116.196.83.113","root","ZHOUjian.21","youmen_db")
# cursor()メソッドを使用して操作カーソルを取得します
cursor = db.cursor()
# SQL更新ステートメント
sql ="UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'"%('M')try:
# SQLステートメントを実行する
cursor.execute(sql)
# 実行のためにデータベースに送信する
db.commit()
except:
# エラーが発生したときにロールバックする
db.rollback()
# データベース接続を閉じる
db.close()
削除操作は、データテーブル内のデータを削除するために使用されます。次の例は、AGEが20より大きいデータテーブルEMPLOYEE内のすべてのデータを削除する方法を示しています。
import pymysql
# データベース接続を開く
db = pymysql.connect("116.196.83.113","root","ZHOUjian.21","youmen_db")
# cursor()メソッドを使用して操作カーソルを取得します
cursor = db.cursor()
# SQL削除ステートメント
sql ="DELETE FROM EMPLOYEE WHERE AGE > %s"%(20)try:
# SQLステートメントを実行する
cursor.execute(sql)
# 変更を送信する
db.commit()
except:
# エラーが発生したときにロールバックする
db.rollback()
# 接続を閉じます
db.close()
トランザクションメカニズムにより、データの一貫性を確保できます****トランザクションには4つの属性が必要です:親和性、一貫性、分離性、耐久性、これら4つの属性は通常ACID特性と呼ばれます
**d
**アトミシティ(atomicity)**機能は分割できない作業単位です,トランザクションに含まれるすべての操作は、実行されるか実行されないかのいずれかです。
一貫性(consistency) 事务必须使数据库从一个一貫性状态到另一个一貫性状态,一貫性与原子性是密切相关的
**隔離(isotation)**トランザクションの実行は、他のトランザクションによって妨害されることはありません。つまり、トランザクションの内部操作と使用されるデータは他の同時トランザクションから分離されており、同時に実行される各トランザクションは相互に干渉できません。.
**永続性(durability).**永続性は永続的とも呼ばれます(permanence),トランザクションがコミットされると、データベース内のデータに対する彼の変更は永続的である必要があることを指します.次の他の操作または失敗はそれに影響を与えるべきではありません.
Python DB API2.0トランザクションは、コミットまたはロールバックの2つのメソッドを提供します。
import pymysql
# データベース接続を開く
db = pymysql.connect("116.196.83.113","root","ZHOUjian.21","youmen_db")
# cursor()メソッドを使用して操作カーソルを取得します
cursor = db.cursor()
# SQL削除レコードステートメント
sql ="DELETE FROM NOTES WHERE AGE > %s"%(20)try:
# SQLステートメントを実行する
cursor.execute(sql)
# データベースに送信する
db.commit()
except:
# エラーが発生したときにロールバックする
db.rollback()
トランザクションをサポートするデータベースの場合、Pythonデータベースプログラミングでは、カーソルが作成されると、非表示のデータベーストランザクションが自動的に開始されます。
commit()メソッドカーソルのすべての更新操作であるrollback()メソッドは、現在のカーソルのすべての操作をロールバックします。各メソッドは新しいトランザクションを開始します。
一部のデータベース操作エラーと例外はDBAPIで定義されています。これらのエラーと例外を以下に示します。
異常な | 説明 |
---|---|
Warning | 挿入されたデータが切り捨てられるなど、重大な警告が発生した場合にトリガーされます。 StandardErrorのサブクラスである必要があります。 |
Error | 警告を除く他のすべてのエラークラス。 StandardErrorのサブクラスである必要があります。 |
InterfaceError | (データベースのエラーではなく)データベースインターフェイスモジュール自体のエラーが発生したときにトリガーされます。 Errorのサブクラスである必要があります。 |
DatabaseError | データベースに関連するエラーが発生したときにトリガーされます。 Errorのサブクラスである必要があります。 |
DataError | ゼロによる除算エラー、データが範囲外などのデータ処理エラーが発生したときにトリガーされます。 DatabaseErrorのサブクラスである必要があります。 |
OperationalError | ユーザーが制御できないが、データベースの操作時に発生するエラーを指します。例:予期しない切断、データベース名が見つからない、トランザクション処理の失敗、メモリ割り当てエラーなどは、データベースの操作中に発生するエラーです。 DatabaseErrorのサブクラスである必要があります。 |
IntegrityError | 外部キーチェックの失敗など、整合性に関連するエラー。 DatabaseErrorサブクラスである必要があります。 |
InternalError | カーソルの失敗、トランザクションの同期の失敗など、データベースの内部エラー。 DatabaseErrorサブクラスである必要があります。 |
ProgrammingError | データテーブル(テーブル)が見つからないか、すでに存在している、SQLステートメントの構文エラー、パラメータの数が間違っているなどのプログラムエラー。 DatabaseErrorのサブクラスである必要があります。 |
NotSupportedError | サポートされていないエラーとは、データベースでサポートされていない関数またはAPIの使用を指します。たとえば、接続オブジェクトで使用します.rollback()機能しますが、データベースがトランザクションをサポートしていないか、トランザクションが閉じられています。 DatabaseErrorのサブクラスである必要があります。 |
import pymysql
classDB():
def __init__(self, host='localhost', port=3306, db='', user='root', passwd='root', charset='utf8'):
# 接続を確立する
self.conn = pymysql.connect(host=host, port=port, db=db, user=user, passwd=passwd, charset=charset)
# カーソルを作成すると、操作は辞書タイプに設定されます
self.cur = self.conn.cursor(cursor = pymysql.cursors.DictCursor)
def __enter__(self):
# カーソルを返す
return self.cur
def __exit__(self, exc_type, exc_val, exc_tb):
# データベースを送信して実行します
self.conn.commit()
# カーソルを閉じる
self.cur.close()
# データベース接続を閉じる
self.conn.close()if __name__ =='__main__':withDB(host='192.168.68.129',user='root',passwd='zhumoran',db='text3')as db:
db.execute('select * from course')print(db)for i in db:print(i)
1
Recommended Posts