Python创建SQL数据库流程逐步讲解


Posted in Python onSeptember 23, 2022

前言

根据《2021年Stackoverflow开发者调查》,

SQL是最常用的五种编程语言之一。

所以,我们应该多投入时间来学习SQL。

由Storyset绘制的人物插图

但是有一个问题:

如何在没有数据库的情况下练习数据库查询呢?

在今天的文章中,让我们一起来解决这个基本问题,学习如何从零开始创建自己的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. 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;

Python创建SQL数据库流程逐步讲解

基本查询结果[图片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从头创建自己的数据库提供了额外的学习机会。由于SQL和Python经常紧密联系在一起,所以这些学习机会可能会特别有用。

到此这篇关于Python创建SQL数据库流程逐步讲解的文章就介绍到这了,更多相关Python创建SQL内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的生成器和yield详细介绍
Jan 09 Python
使用pdb模块调试Python程序实例
Jun 02 Python
python实现简单神经网络算法
Mar 10 Python
Python csv模块使用方法代码实例
Aug 29 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
Python3常见函数range()用法详解
Dec 30 Python
python range实例用法分享
Feb 06 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
如何用Python绘制3D柱形图
Sep 16 Python
python安装及变量名介绍详解
Dec 12 Python
Python中生成ndarray实例讲解
Feb 22 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 #Python
使用python生成大量数据写入es数据库并查询操作(2)
Sep 23 #Python
Python sklearn分类决策树方法详解
详解Golang如何实现支持随机删除元素的堆
python中validators库的使用方法详解
Sep 23 #Python
Python pyecharts案例超市4年数据可视化分析
Aug 14 #Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 #Python
You might like
我的论坛源代码(八)
2006/10/09 PHP
php关联数组快速排序的方法
2015/04/17 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
js数字计算 误差问题的快速解决方法
2017/02/28 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
Python ldap实现登录实例代码
2016/09/30 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
草莓网英国官网:Strawberrynet UK
2017/02/12 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
大学本科生的个人自我评价
2013/12/09 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
元旦晚会活动总结
2014/07/09 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技