<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
根據《2021年Stackoverflow開發者調查》,
SQL是最常用的五種程式語言之一。
所以,我們應該多投入時間來學習SQL。
由Storyset繪製的人物插圖
但是有一個問題:
如何在沒有資料庫的情況下練習資料庫查詢呢?
在今天的文章中,讓我們一起來解決這個基本問題,學習如何從零開始建立自己的MySQL資料庫。在Python和一些外部庫的幫助下,我們將建立一個簡單的指令碼,可以自動建立並使用隨機生成的資料,填充我們的表格。
但是,在討論實現細節之前,我們首先需要討論一些先決條件。
注意:當然還有其他方法可以獲取用於實踐的SQL資料庫(例如直接找資源下載),但使用Python和一些外部庫可以為我們提供額外且有價值的實踐機會。
我們先從最基本的開始。
首先,需要安裝MySQL Workbench並連線服務,接下來就可以開始建立資料庫:
CREATE DATABASE IF NOT EXISTS your_database_name;
現在,我們只需要安裝必要的python庫,基本的設定就完成了。我們將要使用的庫如下所示,可以通過終端輕鬆安裝。
完成基本設定後,我們可以開始編寫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經常緊密聯絡在一起,所以這些學習機會可能會特別有用。
到此這篇關於Python建立SQL資料庫流程逐步講解的文章就介紹到這了,更多相關Python建立SQL內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45