当前位置: 首页 > 科技观察

使用PostgreSQL构建您的数据库

时间:2023-03-20 14:33:07 科技观察

数据库是以有组织和灵活的方式存储信息的工具。电子表格本质上是一个数据库,但是图形应用程序的局限性使得大多数电子表格应用程序对程序员来说毫无用处。随着边缘计算和物联网设备成为重要的平台,开发人员需要更高效、更轻量级的方式来存储、处理和查询大量数据。我最喜欢的组合之一是使用Lua连接到PostgreSQL数据库。无论您使用什么编程语言,PostgreSQL一定是数据库的绝佳选择,但在使用PostgreSQL之前,您首先需要了解一些基本知识。安装PostgreSQL要在Linux上安装PostgreSQL,请使用您的存储库。在Fedora、CentOS、Megeia和类似的Linux发行版上:$sudodnfinstallpostgresqlpostgresql-server在Debian、LinuxMint、Elementary和类似的Linux发行版上使用命令:$sudoaptinstallpostgresqlpostgresql-contrib在macOs和Windows上,您可以从官网postgresql.org下载安装包。配置PostgreSQL大多数发行版安装PostgreSQL数据库而不启动它,但会为您提供脚本或系统服务来可靠地启动PostgreSQL。但是,在启动PostgreSQL之前,必须创建一个数据库集群。Fedora在Fedora、CentOS等类似版本上,PostgreSQL安装包中提供了PostgreSQL配置脚本。运行此脚本进行简单配置:$sudo/usr/bin/postgresql-setup--initdb[sudo]password:*Initializingdatabasein'/var/lib/pgsql/data'*Initialized,logsarein/var/lib/pgsql/initdb_postgresql.logDebian在基于Debian的发行版上,配置是在Postgres安装期间通过apt自动完成的。其他版本最后,如果你在其他版本上运行,你可以直接使用PostgreSQL提供的一些工具。initdb命令会创建一个数据库集群,但是这个命令必须在postgres用户下运行,可以使用sudo临时成为postgres用户:$sudo-upostgres\"initdb-D/var/lib/pgsql/data\--localeen_US.UTF-8--authmd5--pwprompt"RunPostgreSQL现在数据库集群已经存在,使用initdb输出中给你的命令或使用systemd启动PostgreSQL服务器:$sudosystemctlstartpostgresqlCreate数据库用户使用createuser命令创建数据库用户。postgres用户是Postgres安装的超级用户。创建数据库$sudo-upostgrescreateuser--interactive--passwordbogus新角色应该是超级用户吗?(y/n)n是否允许新角色创建数据库?(y/n)y是否允许新角色创建更多新角色?(y/n)n密码:使用createdb命令创建新数据库。在此示例中,我创建了数据库exampledb并将数据库的所有者分配给用户bogus。$createdbexampledb--ownerbogus与PostgreSQL交互您可以使用psql命令与PostgreSQL中的数据库交互。此命令提供了一个交互式界面,因此您可以使用它来查看和更新??数据库。要连接到数据库,您需要指定要使用的用户和数据库。$psql--userbogusexampledbpsql(XX.Y)输入“help”寻求帮助。exampledb=>Createatable数据库包含很多表。这些表可以可视化为表,有很多行(在数据库中称为记录)和很多列。行和列的交集称为字段。结构化查询语言(SQL)以其提供的内容命名,它为查询数据库内容以获得有用的结果提供了可预测且一致的语法。目前,您的数据库是空的,没有任何表。您可以使用CREATE语句创建一个表。与IFNOTEXISTS结合使用以避免破坏现有表。在创建表之前,请考虑您希望表包含哪种数据(在SQL术语中称为“数据类型”)。在此示例中,我创建了一个包含两列的表,一个唯一标识符和一个最多九个字符的可变长度列。exampledb=>CREATETABLEIFNOTEXISTSmy_sample_table(exampledb(>idSERIAL,exampledb(>wordlistVARCHAR(9)NOTNULL);关键字SERIAL不是数据类型,SERIAL是PostgreSQL中的一个特殊标记,可以创建一个auto-自增整型字段,关键字VARCHAR是表示限制内可变字符数的数据类型,本例中我指定最多9个字符,PostgreSQL中数据类型很多,看项目文档获取选项列表。插入数据您可以使用INSERT语句将一些示例数据插入到新表中:exampledb=>INSERTINTOmy_sample_table(wordlist)VALUES('Alice');INSERT01如果你试图在wordlist字段中输入超过9个字符,那么数据输入将失败:exampledb=>INSERTINTOmy_sample_table(WORDLIST)VALUES('Alexandria');ERROR:VALUEtoolongFORTYPECHARACTERVARYING(9)当你需要改变一个字段的定义时,你可以使用SQL关键字ALTER。例如,如果要更改wordlist字段中9个字符的限制,则可以重新设置此数据类型。exampledb=>ALTERTABLEmy_sample_tableALTERCOLUMNwordlistSETDATATYPEVARCHAR(10);ALTERTABLEexampledb=>INSERTINTOmy_sample_table(WORDLIST)VALUES('Alexandria');INSERT01查询表内容SQL是一种查询语言,所以可以通过查询来查看数据库的内容。查询可以非常简单,也可以涉及连接许多不同表的复杂关系。要查看表中的所有内容,请使用SELECT关键字和*(*是通配符):exampledb=>SELECT*FROMmy_sample_table;编号|词表-----+------------1|爱丽丝2|鲍勃3|Alexandria(3ROWS)更多数据PostgreSQL可以处理大量数据,但与任何数据库一样,关键是你如何设计你的数据库以及你如何在存储数据后查询数据。OECD.org提供了一个相对较大的公共数据集,您可以使用它来试验一些高级数据库技术。首先,将数据下载为逗号分隔值(CSV)文件,并将文件另存为land-cover.csv在下载文件夹中。在文本编辑器或电子表格应用程序中浏览数据,查看有哪些列以及每列包含的数据类型。仔细查看数据并注意错误情况。例如,COU列指的是国家代码,例如AUS表示澳大利亚,GRC表示希腊,该列的值通常为奇数BRIICS前3个字符。理解了这些数据项之后,就可以准备一个PostgreSQL数据库了。$createdblandcoverdb--ownerbogus$psql--userboguslandcoverdblandcoverdb=>创建表land_cover(country_codevarchar(6),country_namevarchar(76),small_subnational_region_codevarchar(5),small_subnational_region_namevarchar(14),large_subnational_region_codevarchar(17),large_subnational_region_namevarchar(44),measure_codevarchar(13),measure_namevarchar(29),land_cover_class_codevarchar(17),land_cover_class_namevarchar(19),year_codeinteger,year_valueinteger,unit_codevarchar(3),unit_namevarchar(17),power_codeinteger,power_namevarchar(9),reference_period_codevarchar(1),reference_period_namevarchar(1),valuefloat(8),flag_codesvarchar(1),flag_namesvarchar(1));引入数据Postgres可以使用特殊的元命令\copy来直接导入CSV数据:landcoverdb=>\copyland_coverfrom'~/land-cover.csv'withcsvheaderdelimiter','COPY22113插入了22113条记录。这是一个很好的开始!查询数据使用SELECT语句查询这22113条记录的所有列,PostgreSQL将输出通过管道输出到屏幕上,你可以轻松地滚动鼠标查看输出结果。更进一步,您可以使用高级SQL语句来获取一些有用的视图。landcoverdb=>SELECTlcm.country_name,lcm.year_value,SUM(lcm.value)sum_valueFROMland_coverlcmJOIN(SELECTcountry_name,large_subnational_region_name,small_subnational_region_name,MAX(year_value)max_year_valueFROMland_coverGROUPBYcountry_name,large_subnational_region_name,small_subnational_region_name)作为lcmyvONlcm.country_name=lcmyv.country_nameANDlcm.large_subnational_region_name=lcmyv.large_subnational_region_nameANDlcm.small_subnational_region_name=lcmyv.small_subnational_region_nameANDlcm.year_value=lcmyv.max_year_value按lcm.country_name、lcm.large_subnational_region_name、lcm.small_subnational_region_name、lcm.small_subnational_region_name分组,year_value;下面是类似的一些输出:--------------+------------+------------阿富汗哈尼斯坦|2019|743.48425阿尔巴尼亚|2019|128.82532阿尔及利亚|2019|2417.3281美属萨摩亚|2019|100.2007安道尔|2019|100.45613安哥拉|2019|1354.2192安圭拉|2019|100.078514南极洲|2019|12561.907[...]SQL是一种非常丰富的语言,超出了本文的范围。通读SQL以查看是否可以修改上面的查询以提供不同的数据集。扩展数据库PostgreSQL是最好的开源数据库之一。有了它,您可以为结构化数据设计一个存储库,然后使用SQL以不同的方式查询它,以便能够获得有关该数据的新视角。PostgreSQL还集成了多种语言,包括Python、Lua、Groovy、Java等,因此无论您使用什么工具集,都可以充分利用这个强大的数据库。