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显示天气预报
Mar 02 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
利用python开发app实战的方法
Jul 09 Python
python应用文件读取与登录注册功能
Sep 23 Python
利用pandas合并多个excel的方法示例
Oct 10 Python
通过Python实现一个简单的html页面
May 16 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
Python如何将将模块分割成多个文件
Aug 04 Python
浅析python函数式编程
Sep 26 Python
Python anaconda安装库命令详解
Oct 16 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
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
深入php处理整数函数的详解
2013/06/09 PHP
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
php原生导出excel文件的两种方法(推荐)
2016/11/19 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
2017/10/17 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
swiper实现导航滚动效果
2020/12/13 Javascript
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
Python基础篇之初识Python必看攻略
2016/06/23 Python
python os模块简单应用示例
2019/05/23 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
食品营养与检测应届生求职信
2013/11/08 职场文书
护理工作感言
2014/01/16 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
信电学院毕业生自荐书
2014/05/24 职场文书
天猫活动策划方案
2014/08/21 职场文书
暑期培训班招生方案
2014/08/26 职场文书
教师节随笔
2015/08/15 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL