分类 技术 下的文章

简而言之,归档是一个包含一系列文件和(或)目录的单一文件。归档文件通常用于在本地或互联网上传输,或作为一个一系列文件和目录的备份副本,从而允许你使用一个文件来工作(如果压缩,则其大小会小于所有文件的总和)。同样的,归档也用于软件应用程序打包。为了方便传输,可以很容易地压缩这个单一文件,而存档中的文件会保留原始结构和权限。

我们可以使用 tar 工具来创建、列出和提取归档中的文件。用 tar 生成的归档通常称为“tar 文件”、“tar 归档”或者“压缩包”(因为所有已归档的文件被合成了一个文件)。

本教程会展示如何使用 tar 创建、列出和提取归档中的内容。这三个操作都会使用两个公共选项 -f-v:使用 -f 指定归档文件的名称,使用 -v(“冗余”)选项使 tar 在处理文件时输出文件名。虽然 -v 选项不是必需的,但是它可以让你观察 tar 操作的过程。

在本教程的下面部分中,会涵盖 3 个主题:1、创建一个归档文件;2、列出归档文件内容;3、提取归档文件内容。另外我们会回答归档文件管理的 6 个实际问题来结束本教程。你从本教程学到的内容对于执行与网络安全云技术相关的任务至关重要。

1、创建一个归档文件

要使用 tar 创建一个归档文件,使用 -c(“创建”)选项,然后用 -f 选项指定要创建的归档文件名。通常的做法是使用带有 .tar 扩展名的名称,例如 my-backup.tar。注意,除非另有特别说明,否则本文其余部分中使用的所有命令和参数都以小写形式使用。记住,在你的终端上输入本文的命令时,无需输入每个命令行开头的 $ 提示符。

输入要归档的文件名作为参数;如果要创建一个包含所有文件及其子目录的归档文件,提供目录名称作为参数。

要归档 project 目录内容,输入:

$ tar -cvf project.tar project

这个命令将创建一个名为 project.tar 的归档文件,包含 project 目录的所有内容,而原目录 project 将保持不变。

使用 -z 选项可以对归档文件进行压缩,这样产生的输出与创建未压缩的存档然后用 gzip 压缩是一样的,但它省去了额外的步骤。

要从 project 目录创建一个 project.tar.gz 的压缩包,输入:

$ tar -zcvf project.tar.gz project

这个命令将创建一个 project.tar.gz 的压缩包,包含 project 目录的所有内容,而原目录 project 将保持不变。

注意: 在使用 -z 选项时,你应该使用 .tar.gz 扩展名而不是 .tar 扩展名,这样表示已压缩。虽然不是必须的,但这是一个很好的实践。

gzip 不是唯一的压缩形式,还有 bzip2 和 xz。当我们看到扩展名为 .xz 的文件时,我们知道该文件是使用 xz 压缩的,扩展名为 .bz2 的文件是用 bzip2 压缩的。随着 bzip2 不再维护,我们将远离它而关注 xz。使用 xz 压缩时,需要花费更长的时间。然而,等待通常是值得的,因为压缩效果要好的多,这意味着压缩包通常比使用其它压缩形式要小。更好的是,不同压缩形式之间的解压缩或提取文件并没有太大区别。下面我们将看到一个使用 tar 压缩文件时如何使用 xz 的示例:

$ tar -Jcvf project.tar.xz project

我们只需将 gzip-z 选项转换为 xz 的大写 -J 即可。以下是一些输出,显示压缩形式之间的差异:

如你所见,xz 的压缩时间最长。但是,它在减小文件大小方面做的最好,所以值得等待。文件越大,压缩效果也越好。

2、列出归档文件的内容

要列出 tar 归档文件的内容但不提取,使用 -t 选项。

要列出 project.tar 的内容,输入:

$ tar -tvf project.tar

这个命令列出了 project.tar 归档的内容。-v-t 选项一起使用会输出每个文件的权限和修改时间,以及文件名。这与 ls 命令使用 -l 选项时使用的格式相同。

要列出 project.tar.gz 压缩包的内容,输入:

$ tar -tzvf project.tar.gz

3、从归档中提取内容

要提取(解压)tar 归档文件中的内容,使用 -x(“提取”)选项。

要提取 project.tar 归档的内容,输入:

$ tar -xvf project.tar

这个命令会将 project.tar 归档的内容提取到当前目录。

如果一个归档文件被压缩,通常来说它的扩展名为 .tar.gz.tgz,请包括 "-z" 选项。

要提取 project.tar.gz 压缩包的内容,输入:

$ tar -zxvf project.tar.gz

注意: 如果当前目录中有文件或子目录与归档文件中的内容同名,那么在提取归档文件时,这些文件或子目录将被覆盖。如果你不知道归档中包含哪些文件,请考虑先查看归档文件的内容。

在提取归档内容之前列出其内容的另一个原因是,确定归档中的内容是否包含在目录中。如果没有,而当前目录中包含许多不相关的文件,那么你可能将它们与归档中提取的文件混淆。

要将文件提取到它们自己的目录中,新建一个目录,将归档文件移到该目录,然后你就可以在新目录中提取文件。

FAQ

现在我们已经学习了如何创建归档文件并列出和提取其内容,接下来我们可以继续讨论 Linux 专业人员经常被问到的 9 个实用问题。

可以在不解压缩的情况下添加内容到压缩包中吗?

很不幸,一旦文件将被压缩,就无法向其添加内容。你需要解压缩或提取其内容,然后编辑或添加内容,最后再次压缩文件。如果文件很小,这个过程不会花费很长时间,否则请等待一会。

可以在不解压缩的情况下删除归档文件中的内容吗?

这取决压缩时使用的 tar 版本。较新版本的 tar 支持 -delete 选项。

例如,假设归档文件中有 file1file2,可以使用以下命令将它们从 file.tar 中删除:

$ tar -vf file.tar –delete file1 file2

删除目录 dir1

$ tar -f file.tar –delete dir1/*

压缩和归档之间有什么区别?

查看归档和压缩之间差异最简单的方法是查看其解压大小。归档文件时,会将多个文件合并为一个。所以,如果我们归档 10 个 100kb 文件,则最终会得到一个 100kb 大小的文件。而如果压缩这些文件,则最终可能得到一个只有几 kb 或接近 100kb 的文件。

如何压缩归档文件?

如上所说,你可以使用带有 cvf 选项的 tar 命令来创建和归档文件。要压缩归档文件,有两个选择:通过压缩程序(例如 gzip)运行归档文件,或在使用 tar 命令时使用压缩选项。最常见的压缩标志 -z 表示 gzip-j 表示 bzip-J 表示 xz。例如:

$ gzip file.tar

或者,我们可以在使用 tar 命令时使用压缩标志,以下命令使用 gzip 标志 z

$ tar -cvzf file.tar /some/directory

如何一次创建多个目录和/或文件的归档?

一次要归档多个文件,这种情况并不少见。一次归档多个文件和目录并不像你想的那么难,你只需要提供多个文件或目录作为 tar 的参数即可:

$ tar -cvzf file.tar file1 file2 file3

或者

$ tar -cvzf file.tar /some/directory1 /some/directory2

创建归档时如何跳过目录和/或文件?

你可能会遇到这样的情况:要归档一个目录或文件,但不是所有文件,这种情况下可以使用 --exclude 选项:

$ tar –exclude ‘/some/directory’ -cvf file.tar /home/user

在示例中,/home/user 目录中除了 /some/directory 之外都将被归档。将 --exclude 选项放在源和目标之前,并用单引号将要排除的文件或目录引起来,这一点很重要。

总结

tar 命令对展示不需要的文件创建备份或压缩文件很有用。在更改文件之前备份它们是一个很好的做法。如果某些东西在更改后没有按预期正常工作,你始终可以还原到旧文件。压缩不再使用的文件有助于保持系统干净,并降低磁盘空间使用率。还有其它实用程序可以归档或压缩,但是 tar 因其多功能、易用性和受欢迎程度而独占鳌头。

资源

如果你想了解有关 Linux 的更多信息,强烈建议阅读以下文章和教程:

关于作者

Matt Zand 是一位创业者,也是 3 家科技创业公司的创始人: DC Web MakersCoding BootcampsHigh School Technology Services。他也是 使用 Hyperledger Fabric 进行智能合约开发 一书的主要作者。他为 Hyperledger、以太坊和 Corda R3 平台编写了 100 多篇关于区块链开发的技术文章和教程。在 DC Web Makers,他领导了一个区块链专家团队,负责咨询和部署企业去中心化应用程序。作为首席架构师,他为编码训练营设计和开发了区块链课程和培训项目。他拥有马里兰大学工商管理硕士学位。在区块链开发和咨询之前,他曾担任一些初创公司的高级网页和移动应用程序开发和顾问、天使投资人和业务顾问。你可以通过以下这个网址和他取得联系: https://www.linkedin.com/in/matt-zand-64047871

Kevin Downs 是 Red Hat 认证的系统管理员和 RHCSA。他目前在 IBM 担任系统管理员,负责管理数百台运行在不同 Linux 发行版上的服务器。他是编码训练营的首席 Linux 讲师,并且他会讲授 5 个自己的课程


via: https://www.linux.com/news/how-to-create-and-manage-archive-files-in-linux-2/

作者:LF Training 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

容器很棒,让你可以将你的应用连同其依赖项一起打包,并在任何地方运行。从 2013 年的 Docker 开始,容器已经让软件开发者的生活变得更加轻松。

Docker 的一个缺点是它有一个中央守护进程,它以 root 用户的身份运行,这对安全有影响。但这正是 Podman 的用武之地。Podman 是一个 无守护进程容器引擎,用于开发、管理和在你的 Linux 系统上以 root 或无 root 模式运行 OCI 容器。

下面这些文章可以用来了解更多关于 Podman 的信息:

如果你使用过 Docker,你很可能也知道 Docker Compose,它是一个用于编排多个可能相互依赖的容器的工具。要了解更多关于 Docker Compose 的信息,请看它的文档

什么是 Podman Compose?

Podman Compose 项目的目标是作为 Docker Compose 的替代品,而不需要对 docker-compose.yaml 文件进行任何修改。由于 Podman Compose 使用 吊舱 pod 工作,所以最好看下“吊舱”的最新定义。

一个“ 吊舱 pod ”(如一群鲸鱼或豌豆荚)是由一个或多个容器组成的组,具有共享的存储/网络资源,以及如何运行容器的规范。

Pods - Kubernetes 文档

(LCTT 译注:容器技术领域大量使用了航海比喻,pod 一词,意为“豆荚”,在航海领域指“吊舱” —— 均指盛装多个物品的容器。常不翻译,考虑前后文,可译做“吊舱”。)

Podman Compose 的基本思想是,它选中 docker-compose.yaml 文件里面定义的服务,为每个服务创建一个容器。Docker Compose 和 Podman Compose 的一个主要区别是,Podman Compose 将整个项目的容器添加到一个单一的吊舱中,而且所有的容器共享同一个网络。如你在例子中看到的,在创建容器时使用 --add-host 标志,它甚至用和 Docker Compose 一样的方式命名容器。

安装

Podman Compose 的完整安装说明可以在项目页面上找到,它有几种方法。要安装最新的开发版本,使用以下命令:

pip3 install https://github.com/containers/podman-compose/archive/devel.tar.gz

确保你也安装了 Podman,因为你也需要它。在 Fedora 上,使用下面的命令来安装Podman:

sudo dnf install podman

例子:用 Podman Compose 启动一个 WordPress 网站

想象一下,你的 docker-compose.yaml 文件在一个叫 wpsite 的文件夹里。一个典型的 WordPress 网站的 docker-compose.yaml (或 docker-compose.yml) 文件是这样的:

version: "3.8"
services:
  web:
    image: wordpress
    restart: always
    volumes:
      - wordpress:/var/www/html
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: magazine
      WORDPRESS_DB_NAME: magazine
      WORDPRESS_DB_PASSWORD: 1maGazine!
      WORDPRESS_TABLE_PREFIX: cz
      WORDPRESS_DEBUG: 0
    depends_on:
      - db
    networks:
      - wpnet
  db:
    image: mariadb:10.5
    restart: always
    ports:
      - 6603:3306

    volumes:
      - wpdbvol:/var/lib/mysql

    environment:
      MYSQL_DATABASE: magazine
      MYSQL_USER: magazine
      MYSQL_PASSWORD: 1maGazine!
      MYSQL_ROOT_PASSWORD: 1maGazine!
    networks:
      - wpnet
volumes:
  wordpress: {}
  wpdbvol: {}

networks:
  wpnet: {}

如果你用过 Docker,你就会知道你可运行 docker-compose up 来启动这些服务。Docker Compose 会创建两个名为 wpsite_web_1wpsite_db_1 的容器,并将它们连接到一个名为 wpsite_wpnet 的网络。

现在,看看当你在项目目录下运行 podman-compose up 时会发生什么。首先,一个以执行命令的目录命名的吊舱被创建。接下来,它寻找 YAML 文件中定义的任何名称的卷,如果它们不存在,就创建卷。然后,在 YAML 文件的 services 部分列出的每个服务都会创建一个容器,并添加到吊舱中。

容器的命名与 Docker Compose 类似。例如,为你的 web 服务创建一个名为 wpsite_web_1 的容器。Podman Compose 还为每个命名的容器添加了 localhost 别名。之后,容器仍然可以通过名字互相解析,尽管它们并不像 Docker 那样在一个桥接网络上。要做到这一点,使用选项 -add-host。例如,-add-host web:localhost

请注意,docker-compose.yaml 包含了一个从主机 8080 端口到容器 80 端口的 Web 服务的端口转发。现在你应该可以通过浏览器访问新 WordPress 实例,地址为 http://localhost:8080

WordPress Dashboard

控制 pod 和容器

要查看正在运行的容器,使用 podman ps,它可以显示 web 和数据库容器以及吊舱中的基础设施容器。

CONTAINER ID  IMAGE                               COMMAND               CREATED      STATUS          PORTS                                         NAMES
a364a8d7cec7  docker.io/library/wordpress:latest  apache2-foregroun...  2 hours ago  Up 2 hours ago  0.0.0.0:8080->80/tcp, 0.0.0.0:6603->3306/tcp  wpsite_web_1
c447024aa104  docker.io/library/mariadb:10.5      mysqld                2 hours ago  Up 2 hours ago  0.0.0.0:8080->80/tcp, 0.0.0.0:6603->3306/tcp  wpsite_db_1
12b1e3418e3e  k8s.gcr.io/pause:3.2

你也可以验证 Podman 已经为这个项目创建了一个吊舱,以你执行命令的文件夹命名。

POD ID        NAME             STATUS    CREATED      INFRA ID      # OF CONTAINERS
8a08a3a7773e  wpsite           Degraded  2 hours ago  12b1e3418e3e  3

要停止容器,在另一个命令窗口中输入以下命令:

podman-compose down

你也可以通过停止和删除吊舱来实现。这实质上是停止并移除所有的容器,然后再删除包含的吊舱。所以,同样的事情也可以通过这些命令来实现:

podman pod stop podname
podman pod rm podname

请注意,这不会删除你在 docker-compose.yaml 中定义的卷。所以,你的 WordPress 网站的状态被保存下来了,你可以通过运行这个命令来恢复它。

podman-compose up

总之,如果你是一个 Podman 粉丝,并且用 Podman 做容器工作,你可以使用 Podman Compose 来管理你的开发和生产中的容器。


via: https://fedoramagazine.org/manage-containers-with-podman-compose/

作者:Mehdi Haghgoo 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这是 Python 之禅特别系列的一部分,重点是一个额外的原则:命名空间。

 title=

著名的 光明节 Hanukkah 有八个晚上的庆祝活动。然而,光明节的灯台有九根蜡烛:八根普通的蜡烛和总是偏移的第九根蜡烛。它被称为 “shamash” 或 “shamos”,大致可以翻译为“仆人”或“看门人”的意思。

shamos 是点燃所有其它蜡烛的蜡烛:它是唯一一支可以用火的蜡烛,而不仅仅是观看。当我们结束 Python 之禅系列时,我看到命名空间提供了类似的作用。

Python 中的命名空间

Python 使用命名空间来处理一切。虽然简单,但它们是稀疏的数据结构 —— 这通常是实现目标的最佳方式。

命名空间 是一个从名字到对象的映射。

—— Python.org

模块是命名空间。这意味着正确地预测模块语义通常只需要熟悉 Python 命名空间的工作方式。类是命名空间,对象是命名空间。函数可以访问它们的本地命名空间、父命名空间和全局命名空间。

这个简单的模型,即用 . 操作符访问一个对象,而这个对象又通常(但并不总是)会进行某种字典查找,这使得 Python 很难优化,但很容易解释。

事实上,一些第三方模块也采取了这个准则,并以此来运行。例如,variants 包把函数变成了“相关功能”的命名空间。这是一个很好的例子,说明 Python 之禅 是如何激发新的抽象的。

结语

感谢你和我一起参加这次以光明节为灵感的 我最喜欢的语言 的探索。

静心参禅,直至悟道。


via: https://opensource.com/article/19/12/zen-python-namespaces

作者:Moshe Zadka 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

用户选择 Arch Linux基于 Arch 的 Linux 发行版的主要原因之一就是 Arch 用户仓库(AUR)

遗憾的是,pacman,也就是 Arch 的包管理器,不能以类似官方仓库的方式访问 AUR。AUR 中的包是以 PKGBUILD 的形式存在的,需要手动过程来构建。

AUR 助手可以自动完成这个过程。毫无疑问,yay 是最受欢迎和备受青睐的 AUR 助手之一。

最近,yay 的两位开发者之一的 Morganamilo宣布将退出 yay 的维护工作,以开始自己的 AUR 助手 paruparu 是用 Rust 编写的,而 yay 是用 Go 编写的,它的设计是基于 yay 的。

请注意,yay 还没有结束支持,它仍然由 Jguer 积极维护。他还评论说,paru 可能适合那些寻找丰富功能的 AUR 助手的用户。因此我推荐大家尝试一下。

安装 Paru AUR 助手

要安装 paru,打开你的终端,逐一输入以下命令:

sudo pacman -S --needed base-devel
git clone https://aur.archlinux.org/paru.git
cd paru
makepkg -si

现在已经安装好了,让我们来看看如何使用它。

使用 Paru AUR 助手的基本命令

在我看来,这些都是 paru 最基本的命令。你可以在 GitHub 的官方仓库中探索更多。

  • paru <用户输入>:搜索并安装“用户输入”
  • paru -paru -Syu 的别名
  • paru -Sua:仅升级 AUR 包。
  • paru -Qua:打印可用的 AUR 更新
  • paru -Gc <用户输入>:显示“用户输入”的 AUR 评论

充分使用 Paru AUR 助手

你可以在 GitHub 上访问 paru更新日志来查看完整的变更日志历史,或者你可以在首次发布中查看对 yay 的变化。

在 Paru 中启用颜色

要在 paru 中启用颜色,你必须先在 pacman 中启用它。所有的配置文件都在 /etc 目录下。在此例中,我使用 Nano 文本编辑器,但是,你可以选择使用任何基于终端的文本编辑器

sudo nano /etc/pacman.conf

打开 pacman 配置文件后,取消 Color 的注释,即可启用此功能。

反转搜索顺序

根据你的搜索条件,最相关的包通常会显示在搜索结果的顶部。在 paru 中,你可以反转搜索顺序,使你的搜索更容易。

与前面的例子类似,打开 paru 配置文件:

sudo nano /etc/paru.conf

取消注释 BottomUp 项,然后保存文件。

如你所见,顺序是反转的,第一个包出现在了底部。

编辑 PKGBUILD (对于高级用户)

如果你是一个有经验的 Linux 用户,你可以通过 paru 编辑 AUR 包。要做到这一点,你需要在 paru 配置文件中启用该功能,并设置你所选择的文件管理器。

在此例中,我将使用配置文件中的默认值,即 vifm 文件管理器。如果你还没有使用过它,你可能需要安装它。

sudo pacman -S vifm
sudo nano /etc/paru.conf

打开配置文件,如下所示取消注释。

让我们回到 Google Calendar 的 AUR 包,并尝试安装它。系统会提示你审查该软件包。输入 Y 并按下回车。

从文件管理器中选择 PKGBUILD,然后按下回车查看软件包。

你所做的任何改变都将是永久性的,下次升级软件包时,你的改变将与上游软件包合并。

总结

paruAUR 助手家族的又一个有趣的新成员,前途光明。此时,我不建议更换 yay,因为它还在维护,但一定要试试 paru。你可以把它们两个都安装到你的系统中,然后得出自己的结论。


via: https://itsfoss.com/paru-aur-helper/

作者:Dimitrios Savvopoulos 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

开始使用这个功能强大且通用的数据库吧。

 title=

应用程序经常需要保存数据。无论你的用户是创建简单的文本文档、复杂的图形布局、游戏进度还是错综复杂的客户和订单号列表,软件通常都意味着生成数据。有很多方法可以存储数据以供重复使用。你可以将文本转储为 INI、YAML、XML 或 JSON 等配置格式,可以输出原始的二进制数据,也可以将数据存储在结构化数据库中。SQLite 是一个自包含的、轻量级数据库,可轻松创建、解析、查询、修改和传输数据。

SQLite 专用于 公共领域从技术上讲,这意味着它没有版权,因此不需要许可证。如果你需要许可证,则可以 购买所有权担保。SQLite 非常常见,大约有 1 万亿个 SQLite 数据库正在使用中。在每个基于 Webkit 的 Web 浏览器,现代电视机,汽车多媒体系统以及无数其他软件应用程序中,Android 和 iOS 设备, macOS 和 Windows 10 计算机,大多数 Linux 系统上都包含多个这种数据库。

总而言之,它是用于存储和组织数据的一个可靠而简单的系统。

安装

你的系统上可能已经有 SQLite 库,但是你需要安装其命令行工具才能直接使用它。在 Linux上,你可能已经安装了这些工具。该工具提供的命令是 sqlite3 (而不仅仅是 sqlite)。

如果没有在你的 Linux 或 BSD 上安装 SQLite,你则可以从软件仓库中或 ports 树中安装 SQLite,也可以从源代码或已编译的二进制文件进行下载并安装

在 macOS 或 Windows 上,你可以从 sqlite.org 下载并安装 SQLite 工具。

使用 SQLite

通过编程语言与数据库进行交互是很常见的。因此,像 Java、Python、Lua、PHP、Ruby、C++ 以及其他编程语言都提供了 SQLite 的接口(或“绑定”)。但是,在使用这些库之前,了解数据库引擎的实际情况以及为什么你对数据库的选择很重要是有帮助的。本文向你介绍 SQLite 和 sqlite3 命令,以便你熟悉该数据库如何处理数据的基础知识。

与 SQLite 交互

你可以使用 sqlite3 命令与 SQLite 进行交互。 该命令提供了一个交互式的 shell 程序,以便你可以查看和更新数据库。

$ sqlite3
SQLite version 3.34.0 2020-12-01 16:14:00
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

该命令将你使你处于 SQLite 的子 shell 中,因此现在的提示符是 SQLite 的提示符。你以前使用的 Bash 命令在这里将不再适用。你必须使用 SQLite 命令。要查看 SQLite 命令列表,请输入 .help

sqlite> .help
.archive ...             Manage SQL archives
.auth ON|OFF             SHOW authorizer callbacks
.backup ?DB? FILE        Backup DB (DEFAULT "main") TO FILE
.bail ON|off             Stop after hitting an error.  DEFAULT OFF
.binary ON|off           Turn BINARY output ON OR off.  DEFAULT OFF
.cd DIRECTORY            CHANGE the working directory TO DIRECTORY
[...]

这些命令中的其中一些是二进制的,而其他一些则需要唯一的参数(如文件名、路径等)。这些是 SQLite Shell 的管理命令,不是用于数据库查询。数据库以结构化查询语言(SQL)进行查询,许多 SQLite 查询与你从 MySQLMariaDB 数据库中已经知道的查询相同。但是,数据类型和函数有所不同,因此,如果你熟悉另一个数据库,请特别注意细微的差异。

创建数据库

启动 SQLite 时,可以打开内存数据库,也可以选择要打开的数据库:

$ sqlite3 mydatabase.db

如果还没有数据库,则可以在 SQLite 提示符下创建一个数据库:

sqlite> .open mydatabase.db

现在,你的硬盘驱动器上有一个空文件,可以用作 SQLite 数据库。 文件扩展名 .db 是任意的。你也可以使用 .sqlite 或任何你想要的后缀。

创建一个表

数据库包含一些 table ,可以将其可视化为电子表格。有许多的行(在数据库中称为 记录 record )和列。行和列的交集称为 字段 field

结构化查询语言(SQL)以其提供的内容而命名:一种以可预测且一致的语法查询数据库内容以接收有用的结果的方法。SQL 读起来很像普通的英语句子,即使有点机械化。当前,你的数据库是一个没有任何表的空数据库。

你可以使用 CREATE 来创建一个新表,你可以和 IF NOT EXISTS 结合使用。以便不会破坏现在已有的同名的表。

你无法在 SQLite 中创建一个没有任何字段的空表,因此在尝试 CREATE 语句之前,必须考虑预期表将存储的数据类型。在此示例中,我将使用以下列创建一个名为 member 的表:

  • 唯一标识符
  • 人名
  • 记录创建的时间和日期

唯一标识符

最好用唯一的编号来引用记录,幸运的是,SQLite 认识到这一点,创建一个名叫 rowid 的列来为你自动实现这一点。

无需 SQL 语句即可创建此字段。

数据类型

对于我的示例表中,我正在创建一个 name 列来保存 TEXT 类型的数据。为了防止在没有指定字段数据的情况下创建记录,可以添加 NOT NULL 指令。

name TEXT NOT NULL 语句来创建。

SQLite 中有五种数据类型(实际上是 储存类别):

  • TEXT:文本字符串
  • INTEGER:一个数字
  • REAL:一个浮点数(小数位数无限制)
  • BLOB:二进制数据(例如,.jpeg 或 .webp 图像)
  • NULL:空值

日期和时间戳

SQLite 有一个方便的日期和时间戳功能。它本身不是数据类型,而是 SQLite 中的一个函数,它根据所需的格式生成字符串或整数。 在此示例中,我将其保留为默认值。

创建此字段的 SQL 语句是:datestamp DATETIME DEFAULT CURRENT_TIMESTAMP

创建表的语句

在 SQLite 中创建此示例表的完整 SQL:

sqlite> CREATE TABLE
...> IF NOT EXISTS
...> member (name TEXT NOT NULL,
...> datestamp DATETIME DEFAULT CURRENT_TIMESTAMP);

在此代码示例中,我在语句的分句后按了回车键。以使其更易于阅读。除非以分号(;)终止,否则 SQLite 不会运行你的 SQL 语句。

你可以使用 SQLite 命令 .tables 验证表是否已创建:

sqlite> .tables
member

查看表中的所有列

你可以使用 PRAGMA 语句验证表包含哪些列和行:

sqlite> PRAGMA table_info(member);
0|name|TEXT|1||0
1|datestamp|DATETIME|0|CURRENT_TIMESTAMP|0

数据输入

你可以使用 INSERT 语句将一些示例数据填充到表中:

> INSERT INTO member (name) VALUES ('Alice');
> INSERT INTO member (name) VALUES ('Bob');
> INSERT INTO member (name) VALUES ('Carol');
> INSERT INTO member (name) VALUES ('David');

查看表中的数据:

> SELECT * FROM member;
Alice|2020-12-15 22:39:00
Bob|2020-12-15 22:39:02
Carol|2020-12-15 22:39:05
David|2020-12-15 22:39:07

添加多行数据

现在创建第二个表:

> CREATE TABLE IF NOT EXISTS linux (
...> distro TEXT NOT NULL);

填充一些示例数据,这一次使用小的 VALUES 快捷方式,因此你可以在一个命令中添加多行。关键字 VALUES 期望以括号形式列出列表,而用多个逗号分隔多个列表:

> INSERT INTO linux (distro)
...> VALUES ('Slackware'), ('RHEL'),
...> ('Fedora'),('Debian');

修改表结构

你现在有两个表,但是到目前为止,两者之间没有任何关系。它们每个都包含独立的数据,但是可能你可能需要将第一个表的成员与第二个表中列出的特定项相关联。

为此,你可以为第一个表创建一个新列,该列对应于第二个表。由于两个表都设计有唯一标识符(这要归功于 SQLite 的自动创建),所以连接它们的最简单方法是将其中一个的 rowid 字段用作另一个的选择器。

在第一个表中创建一个新列,以存储第二个表中的值:

> ALTER TABLE member ADD os INT;

使用 linux 表中的唯一标识符作为 member 表中每一条记录中 os 字段的值。因为记录已经存在。因此你可以使用 UPDATE 语句而不是使用 INSERT 语句来更新数据。需要特别注意的是,你首先需要选中特定的一行来然后才能更新其中的某个字段。从句法上讲,这有点相反,更新首先发生,选择匹配最后发生:

> UPDATE member SET os=1 WHERE name='Alice';

member 表中的其他行重复相同的过程。更新 os 字段,为了数据多样性,在四行记录上分配三种不同的发行版(其中一种加倍)。

联接表

现在,这两个表相互关联,你可以使用 SQL 显示关联的数据。数据库中有多种 联接方式,但是一旦掌握了基础知识,就可以尝试所有的联接形式。这是一个基本联接,用于将 member 表的 os 字段中的值与 linux 表的 rowid 字段相关联:

> SELECT * FROM member INNER JOIN linux ON member.os=linux.rowid;
Alice|2020-12-15 22:39:00|1|Slackware
Bob|2020-12-15 22:39:02|3|Fedora
Carol|2020-12-15 22:39:05|3|Fedora
David|2020-12-15 22:39:07|4|Debian

osrowid 字段形成了关联。

在一个图形应用程序中,你可以想象 os 字段是一个下拉选项菜单,其中的值是 linux 表中 distro 字段中的数据。将相关的数据集通过唯一的字段相关联,可以确保数据的一致性和有效性,并且借助 SQL,你可以在以后动态地关联它们。

了解更多

SQLite 是一个非常有用的自包含的、可移植的开源数据库。学习以交互方式使用它是迈向针对 Web 应用程序进行管理或通过编程语言库使用它的重要的第一步。

如果你喜欢 SQLite,也可以尝试由同一位作者 Richard Hipp 博士的 Fossil

在学习和使用 SQLite 时,有一些常用命令可能会有所帮助,所以请立即下载我们的 SQLite3 备忘单


via: https://opensource.com/article/21/2/sqlite3-cheat-sheet

作者:Klaatu 选题:lujun9972 译者:amwps290 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这是 Python 之禅特别系列的一部分,重点介绍第十七和十八条原则:困难和容易。

 title=

一门语言并不是抽象存在的。每一个语言功能都必须用代码来实现。承诺一些功能是很容易的,但实现起来就会很麻烦。复杂的实现意味着更多潜在的 bug,甚至更糟糕的是,会带来日复一日的维护负担。

对于这个难题,Python 之禅 中有答案。

如果一个实现难以解释,那就是个坏思路 If the implementation is hard to explain, it's a bad idea

编程语言最重要的是可预测性。有时我们用抽象的编程模型来解释某个结构的语义,而这些模型与实现并不完全对应。然而,最好的释义就是解释该实现

如果该实现很难解释,那就意味着这条路行不通。

如果一个实现易于解释,那它可能是一个好思路 If the implementation is easy to explain, it may be a good idea

仅仅因为某事容易,并不意味着它值得。然而,一旦解释清楚,判断它是否是一个好思路就容易得多。

这也是为什么这个原则的后半部分故意含糊其辞的原因:没有什么可以肯定一定是好的,但总是可以讨论一下。


via: https://opensource.com/article/19/12/zen-python-implementation

作者:Moshe Zadka 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出