Skip to content

数据库

在热铁盒网页托管,我们提供了 KV 数据库,您可以通过云函数来读写它。

创建数据库

您可以使用云函数内置的 Database 类来创建或打开一个数据库实例,只需传入数据库的名称作为参数即可。一个网站可以创建多个数据库,创建的数据库只能被当前网站访问。

php
<?php
$db = new Database("database_name");
js
const db = new Database("database_name");
python
db = Database("database_name")

命名规则

数据库和键的名称只能包含 ASCII 字母、数字、下划线 _ 和连字符 -,且区分大小写。

读取数据

您可以使用 get 方法读取指定键的数据。

php
<?php
$db = new Database("database_name");
$data = db->get("key_name");
echo $data;
js
// 在 Node.js 中,`get` 方法是异步的,因此需要使用 `await` 关键字。
// 我们建议将其放在异步函数中,但如果您想在顶层使用,也可以使用 `.then()`。

async function main() {
	const db = new Database("database_name");
	const data = await db.get("key_name");
	document.write(data);
}

main();
python
# 在 Python 中,所有数据库操作都是同步的,不需要 await。

db = Database("database_name")
data = db.get("key_name")
print(data)

写入数据

您可以使用 set 方法写入指定键的值。写入的值只能是字符串类型,长度不超过 65535 个字符。如需存储其他数据类型,您可以先将其转为字符串。

php
<?php
$db = new Database("database_name");
$db->set("key_name", "value");
js
const db = new Database("database_name");
db.set("key_name", "value");
python
db = Database("database_name")
db.set("key_name", "value")

写入和删除等修改数据库的操作是同步的,不需要 await

删除数据

您可以使用 delete 方法删除指定键的值。

php
<?php
$db = new Database("database_name");
$db->delete("key_name");
js
const db = new Database("database_name");
db.delete("key_name");
python
db = Database("database_name")
db.delete("key_name")

列出所有键

您可以使用 listKeys 方法获取数据库中的所有键名。该方法返回一个键名数组。

php
<?php
$db = new Database("database_name");
$keys = $db->list_keys();
echo implode("<br>", $keys);
js
async function main() {
	const db = new Database("database_name");
	const keys = await db.listKeys();
	document.write(keys);
}

main();
python
db = Database("database_name")
keys = db.list_keys()
print("<br>".join(keys))

模糊查询

您可以使用 searchValue 方法搜索数据库中的值。该方法使用类似 SQL 的 LIKE 语法,其中 % 匹配任意字符串,_ 匹配单个字符。搜索词区分大小写。该方法返回一个包含匹配的键值对的数组,最多返回 1000 条结果。搜索词的长度不能超过 256 个字符。

请注意

模糊查询的效率不如精确查询,请优先使用 get 方法通过键名来精确查询。

php
<?php
$db = new Database("database_name");
$entries = $db->search_value("%hello%");
foreach ($entries as $entry) {
	echo $entry["key"] . ": " . $entry["value"] . "<br>";
}
js
async function main() {
	const db = new Database("database_name");
	const entries = await db.searchValue("%hello%");
	for (const entry of entries) {
		document.write(`${entry.key}: ${entry.value}<br>`);
	}
}

main();
python
from html import escape

db = Database("database_name")
entries = db.search_value("%hello%")
for entry in entries:
    print(f'{escape(entry["key"])}: {escape(entry["value"])}<br>')

返回结果示例:

json
[
	{ "key": "foo", "value": "hello world" },
	{ "key": "bar", "value": "hello there" }
]

数组

set 方法会覆盖指定键已有的值。如果你想在同一个键里放多个值,可以用 push 方法把新值加进去。使用 getArray 方法可以读取这个键下的所有值,返回一个数组。

如果您想删除数组中的某个值,可以使用 delete(key, value) 方法。

请注意

数组的读写效率不如单个值,请优先使用单个值存储。

php
<?php
$db = new Database("database_name");
$db->push("key_name", "value1");
$db->push("key_name", "value2");

echo "添加两个值后:<br>";
$values = $db->get_array("key_name");
echo implode("<br>", $values);
echo "<br>";

$db->delete("key_name", "value1");

echo "删除 value1 后:<br>";
$values = $db->get_array("key_name");
echo implode("<br>", $values);

$db->delete("key_name"); // 删除整个数组
js
async function main() {
	const db = new Database("database_name");
	db.push("key_name", "value1");
	db.push("key_name", "value2");

	document.write("添加两个值后:<br>");
	let values = await db.getArray("key_name");
	document.write(values);
	document.write("<br>");

	db.delete("key_name", "value1");

	document.write("删除 value1 后:<br>");
	values = await db.getArray("key_name");
	document.write(values);

	db.delete("key_name"); // 删除整个数组
}

main();
python
db = Database("database_name")
db.push("key_name", "value1")
db.push("key_name", "value2")

print("添加两个值后:<br>")
values = db.get_array("key_name")
print("<br>".join(values))
print("<br>")

db.delete("key_name", "value1")

print("删除 value1 后:<br>")
values = db.get_array("key_name")
print("<br>".join(values))

db.delete("key_name") # 删除整个数组

完整示例

以下是一个简单的示例,演示如何使用 KV 数据库统计每个名字访问的次数。

php
<?php
$db = new Database("visits");

if (isset($_GET["name"])) {
	$name = $_GET["name"]; // 从网址参数中获取名字
	$count = 0;
	$data = $db->get($name); // 读取数据库
	if ($data !== null) {
		$count = intval($data); // 将数据库里存的字符串转换为数字
	}
	$count++; // 访问次数加 1
	$db->set($name, strval($count)); // 写入数据库
}
?>

<!DOCTYPE html>
<html>
	<head>
		<title>统计</title>
	</head>
	<body>
		<?php
		if (isset($_GET["name"])) {
			echo "<p>欢迎," . htmlspecialchars($name) . "!您访问了本站 $count 次。</p>";
		}
		?>
		<form>
			<label for="name">名字:</label>
			<input type="text" id="name" name="name">
			<input type="submit" />
		</form>
	</body>
</html>
js
async function main() {
	const db = new Database("visits");

	const visitor = req.query.name; // 从网址参数中获取名字
	let count = 0;
	if (visitor) {
		const data = await db.get(visitor); // 读取数据库
		if (data) {
			count = parseInt(data); // 将数据库里存的字符串转换为数字
		}
		count++; // 访问次数加 1
		db.set(visitor, count.toString()); // 写入数据库
	}

	document.write(`
		<!DOCTYPE html>
		<html>
			<head>
				<title>统计</title>
			</head>
			<body>
				${visitor ? `<p>欢迎,${visitor}!您访问了本站 ${count} 次。</p>` : ""}
				<form>
					<label for="name">名字:</label>
					<input type="text" id="name" name="name">
					<input type="submit" />
				</form>
			</body>
		</html>
	`);
}

main();
python
from html import escape

db = Database("visits")

visitor = request.args.get("name") # 从网址参数中获取名字
count = 0
if visitor:
    data = db.get(visitor) # 读取数据库
    if data:
        count = int(data) # 将数据库里存的字符串转换为数字
    count += 1 # 访问次数加 1
    db.set(visitor, str(count)) # 写入数据库

safe_visitor = escape(visitor) if visitor else ""
greeting = f"<p>欢迎,{safe_visitor}!您访问了本站 {count} 次。</p>" if visitor else ""
print(f"""
<!DOCTYPE html>
<html>
    <head>
        <title>统计</title>
    </head>
    <body>
        {greeting}
        <form>
            <label for="name">名字:</label>
            <input type="text" id="name" name="name">
            <input type="submit" />
        </form>
    </body>
</html>
""")

管理数据库

您可以在网站列表中右键点击您的网站,选择「数据库」来查看和管理该网站的所有数据库。在管理界面中,您可以浏览数据库中的键值对、修改或删除数据,无需编写代码即可直接操作数据库。

第三方 SQL 数据库

热铁盒网页托管的 PHP 云函数支持通过 mysqli_connect 连接到第三方 SQL 数据库,例如阿里云 RDS。如果您在第三方平台上创建数据库并打算在热铁盒网页托管中调用,建议选择位于美国西部的数据库实例以获得最低的网络延迟。

php
<?php
$conn = mysqli_connect("host", "username", "password", "database_name");
$result = mysqli_query($conn, "SELECT * FROM table_name");
while ($row = mysqli_fetch_assoc($result)) {
	echo $row["column_name"] . "<br>";
}
mysqli_close($conn);