今日、あなたはあなたの知識を摂取しましたか?
SQLを記述できることは重要であり、データベースに効率的にクエリを実行できることは、データアナリスト/科学者にとって最も基本的なスキルの1つと見なされています。
ビッグデータアプリケーション
School of Data Applicationは、2016年に北米でトップのデータキャンプとして評価されました。これは、最もプロフェッショナルなワンストップデータサイエンスコンサルティングサービス組織であり、データサイエンスのジョブコンサルティングの専門家です。
4336オリジナルコンテンツ
公開なし
SQLは重要であるだけでなく、非常に一般的に使用されています。2021年のStackoverflowDeveloperSurveyによると、SQLは最も使用されている5つのプログラミング言語の1つです。したがって、SQLを学ぶためにより多くの時間を費やす必要があります。
ストーリーセットによるキャラクターイラスト
しかし、疑問があります。データベースなしでデータベースクエリを実行する方法は?
今日の記事では、この基本的な問題に取り組み、独自のMySQLデータベースを最初から作成する方法を学びましょう。Pythonといくつかの外部ライブラリを使用して、ランダムに生成されたデータをテーブルに自動的に作成して入力する簡単なスクリプトを作成します。
ただし、実装の詳細について説明する前に、まずいくつかの前提条件について説明する必要があります。
注:もちろん、練習用のSQLデータベースを取得する方法は他にもあります(直接ダウンロードなど)が、Pythonと一部の外部ライブラリを使用すると、追加の貴重な練習の機会が得られます。
前提条件
まずは基本から始めましょう。
まず、MySQL Workbenchをインストールしてサービスに接続する必要があります。次に、データベースの構築を開始できます。
CREATE DATABASE IF NOT EXISTS your_database_name;
これで、必要なPythonライブラリをインストールするだけで、基本的なセットアップが完了しました。使用するライブラリは以下のとおりで、ターミナルから簡単にインストールできます。
-
1. NumPy: pip install numpy
-
2. Sqlalchemy: pip install sqlalchemy
-
3.フェイカー: pipinstallフェイカー
スクリプトを作成する
基本的なセットアップが完了したら、Pythonスクリプトの作成を開始できます。
ボイラープレートコードを使用してクラスを作成することから始めて、残りの実装をガイドするための青写真を提供します。
import numpy as np
import sqlalchemy
from faker import Faker
from sqlalchemy import Table, Column, Integer, String, MetaData, Date,
class SQLData:
def __init__(self, server:str, db:str, uid:str, pwd:str) -> None:
self.__fake = Faker()
self.__server = server
self.__db = db
self.__uid = uid
self.__pwd = pwd
self.__tables = dict()
def connect(self) -> None:
pass
def drop_all_tables(self) -> None:
pass
def create_tables(self) -> None:
pass
def populate_tables(self) -> None:
pass
特に高度な構文はまだ使用していません。基本的には、クラスを作成し、後で使用するためにデータベースクレデンシャルを保存し、ライブラリをインポートして、いくつかのメソッドを定義しました。
接続を確立する
最初に実行したいのは、データベース接続を作成することです。
幸い、Pythonライブラリsqlalchemyを利用してほとんどの作業を行うことができます。
class SQLData:
#...
def connect(self) -> None:
self.__engine = sqlalchemy.create_engine(
f"mysql+pymysql://{self.__uid}:{self.__pwd}@{self.__server}/{self.__db}"
)
self.__conn = self.__engine.connect()
self.__meta = MetaData(bind=self.__engine)
このメソッドは、3つのオブジェクトをインスタンスプロパティとして作成および保存できます。
まず、sqlalchemyアプリケーションの開始点として機能する接続を作成し、特定のタイプのデータベース/DBAPIの組み合わせと通信する方法を説明します。
この例では、MySQLデータベースを指定し、資格情報を渡します。
次に、SQLステートメントを実行できる接続と、データベースのさまざまな機能をまとめてデータベーステーブルに関連付けてアクセスできるメタデータオブジェクト(コンテナー)を作成します。
テーブルを作成する
次に、データベーステーブルを作成する必要があります。
class SQLData:
#...
def create_tables(self) -> None:
self.__tables['jobs'] = Table (
'jobs', self.__meta,
Column('job_id', Integer, primary_key=True, autoincrement=True, nullable=False),
Column('description', String(255))
)
self.__tables['companies'] = Table(
'companies', self.__meta,
Column('company_id', Integer, primary_key=True, autoincrement=True, nullable=False),
Column('name', String(255), nullable=False),
Column('phrase', String(255)),
Column('address', String(255)),
Column('country', String(255)),
Column('est_date', Date)
)
self.__tables['persons'] = Table(
'persons', self.__meta,
Column('person_id', Integer, primary_key=True, autoincrement=True, nullable=False),
Column('job_id', Integer, ForeignKey('jobs.job_id'), nullable=False),
Column('company_id', Integer, ForeignKey('companies.company_id'), nullable=False),
Column('last_name', String(255), nullable=False),
Column('first_name', String(255)),
Column('date_of_birth', Date),
Column('address', String(255)),
Column('country', String(255)),
Column('zipcode', String(10)),
Column('salary', Integer)
)
self.__meta.create_all()
3つのテーブルを作成し、後で参照できるように辞書に保存しました。
sqlalchemyでのテーブルの作成も非常に簡単です。新しいテーブルをインスタンス化し、テーブル名とメタデータオブジェクトを指定し、さまざまな列を指定するだけです。
この例では、ジョブテーブル、会社テーブル、および個人テーブルを作成しました。また、personテーブルは、外部kkeyを介して他のテーブルをリンクします。これにより、データベースはSQL結合の実践においてより興味深いものになります。
すべてのテーブルが定義されたら、MetaDataオブジェクトのcreate_all()メソッドを呼び出すだけです。
ランダムデータを生成する
データベーステーブルを作成しましたが、まだ利用可能なデータがありません。したがって、ランダムなデータを生成してテーブルに挿入する必要があります。
class SQLData:
#...
def populate_tables(self) -> None:
jobs_ins = list()
companies_ins = list()
persons_ins = list()
for _ in range(100):
record = dict()
record['description'] = self.__fake.job()
jobs_ins.append(record)
for _ in range(100):
record = dict()
record['name'] = self.__fake.company()
record['phrase'] = self.__fake.catch_phrase()
record['address'] = self.__fake.street_address()
record['country'] = self.__fake.country()
record['est_date'] = self.__fake.date_of_birth()
companies_ins.append(record)
for _ in range(500):
record = dict()
record['job_id'] = np.random.randint(1, 100)
record['company_id'] = np.random.randint(1, 100)
record['last_name'] = self.__fake.last_name()
record['first_name'] = self.__fake.first_name()
record['date_of_birth'] = self.__fake.date_of_birth()
record['address'] = self.__fake.street_address()
record['country'] = self.__fake.country()
record['zipcode'] = self.__fake.zipcode()
record['salary'] = np.random.randint(60000, 150000)
persons_ins.append(record)
self.__conn.execute(self.__tables['jobs'].insert(), jobs_ins)
self.__conn.execute(self.__tables['companies'].insert(), companies_ins)
self.__conn.execute(self.__tables['persons'].insert(), persons_ins)
これで、Fakerライブラリを利用してランダムデータを生成できます。
forループでランダムに生成されたデータを使用して、辞書で表される新しいレコードを作成するだけです。次に、単一のレコードが、 (複数の)挿入ステートメントで使用できるリストに追加されます。
次に、接続オブジェクトからexecute()メソッドを呼び出し、辞書のリストを引数として渡します。
それでおしまい!クラスの実装に成功しました。クラスをインスタンス化し、関連する関数を呼び出してデータベースを作成するだけです。
if __name__ == '__main__':
sql = SQLData('localhost','yourdatabase','root','yourpassword')
sql.connect()
sql.create_tables()
sql.populate_tables()
クエリを実行してみてください
残っているのは、データベースが稼働中であり、実際にデータが含まれていることを確認する必要があることだけです。
基本的なクエリから始めます。
SELECT *
FROM jobs
LIMIT 10;
基本的なクエリ結果[作成者による画像]
スクリプトが成功したようで、実際のデータを含むデータベースがあります。
次に、より複雑なSQLステートメントを試してください。
SELECT
p.first_name,
p.last_name,
p.salary,
j.description
FROM
persons AS p
JOIN
jobs AS j ON
p.job_id = j.job_id
WHERE
p.salary > 130000
ORDER BY
p.salary DESC;
この結果はもっともらしいように見えます-私たちのデータベースは適切に機能していると言えます。
結論は
この記事では、Pythonといくつかの外部ライブラリを利用して、ランダムに生成されたデータを使用して独自の実践データベースを作成する方法を学びました。
既存のデータベースをダウンロードしてSQLの練習を開始するのは簡単ですが、Pythonで最初から独自のデータベースを作成すると、追加の学習機会が得られます。SQLとPythonは密接に関連していることが多いため、これらの学習機会は特に役立ちます。
終わり
これでこの共有は終わりです〜お役に立てば幸いです。!気に入った場合は、編集者に3行のフォローアップを提供することを忘れないでください♀️
家族のサポートは、編集者が更新する最大の動機です
より完全なソースコードとPython学習資料を入手したい場合は、このフォント行をクリックしてください。