網站首頁 編程語言 正文
前言
根據《2021年Stackoverflow開發者調查》,
SQL是最常用的五種編程語言之一。
所以,我們應該多投入時間來學習SQL。
由Storyset繪制的人物插圖
但是有一個問題:
如何在沒有數據庫的情況下練習數據庫查詢呢?
在今天的文章中,讓我們一起來解決這個基本問題,學習如何從零開始創建自己的MySQL數據庫。在Python和一些外部庫的幫助下,我們將創建一個簡單的腳本,可以自動創建并使用隨機生成的數據,填充我們的表格。
但是,在討論實現細節之前,我們首先需要討論一些先決條件。
注意:當然還有其他方法可以獲取用于實踐的SQL數據庫(例如直接找資源下載),但使用Python和一些外部庫可以為我們提供額外且有價值的實踐機會。
先決條件
我們先從最基本的開始。
首先,需要安裝MySQL Workbench并連接服務,接下來就可以開始建立數據庫:
CREATE DATABASE IF NOT EXISTS your_database_name;
現在,我們只需要安裝必要的python庫,基本的設置就完成了。我們將要使用的庫如下所示,可以通過終端輕松安裝。
- NumPy: pip install numpy
- Sqlalchemy: pip install sqlalchemy
- Faker: pip install faker
創建腳本
完成基本設置后,我們可以開始編寫python腳本了。
先用一些樣板代碼創建一個類,為我們提供一個藍圖,指導我們完成其余的實現。
import numpy as np
import sqlalchemy
from faker import Faker [python學習裙:90 3971231###
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中創建表也非常簡單。我們只需實例化一個新的表,提供表名、元數據對象,并指定不同的列。
在本例中,我們創建了一個job表、一個company表和一個person表。person表還通過了foreign 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循環中使用隨機生成的數據,創建一個由字典表示的新記錄。然后將單個記錄追加到可用于(多個)insert語句的列表中。
接下來,從連接對象中調用execute()方法,并將字典列表作為參數傳遞。
就是這樣!我們成功實現了類—只需要把類實例化,并調用相關函數來創建數據庫。
if __name__ == '__main__':
sql = SQLData('localhost','yourdatabase','root','yourpassword')
sql.connect()
sql.create_tables()
sql.populate_tables()
試著做一個查詢
剩下的唯一一件事是——需要驗證我們的數據庫是否已經啟動和運行,是否確實包含一些數據。
從基本的查詢開始:
SELECT *
FROM jobs
LIMIT 10;
基本查詢結果[圖片by作者]
看起來我們的腳本成功了,我們有一個包含實際數據的數據庫。
現在,嘗試一個更復雜的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經常緊密聯系在一起,所以這些學習機會可能會特別有用。
原文鏈接:https://blog.csdn.net/xff123456_/article/details/126934353
相關推薦
- 2022-05-27 對Entity?Framework?Core進行單元測試_實用技巧
- 2022-08-15 Redis緩存三大異常的處理方案梳理總結_Redis
- 2021-12-01 騰訊云服務器搭建Jenkins詳細介紹_Linux
- 2023-01-15 Android開發可添加頭尾的RecycleView的實現_Android
- 2022-10-14 ‘configurationClass‘ must be assignable to [org.hi
- 2022-06-27 精簡高效的C#網站優化經驗技巧總結_C#教程
- 2022-04-10 Android中Protobuf的基本使用介紹_Android
- 2022-07-12 用戶手抖,連續點了兩次?優雅解決表單重復提交
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支