- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在有一些 html 数据存储在文本文件中。我最近决定将 HTML 数据存储在 pgsql 数据库中而不是平面文件中。现在,“条目”表包含一个指向文件的“路径”列。我添加了一个“内容”列,现在应该将数据存储在“路径”指向的文件中。完成后,“路径”列将被删除。我遇到的问题是这些文件包含使我的脚本乱七八糟的撇号。我该怎么做才能解决这个问题??
这是脚本
#!/bin/sh
dbname="myDB"
username="username"
fileroot="/path/to/the/files/*"
for f in $fileroot
do
psql $dbname $username -c "
UPDATE entries
SET content='`cat $f`'
WHERE id=SELECT id FROM entries WHERE path LIKE '*`$f`';"
done
注意:id=SELECT...FROM...WHERE path LIKE ""
中的逻辑不是问题所在。我已经在 pgsql 环境中使用示例文件名对此进行了测试。
问题是,当我 cat $f
时,Edit: the contents of $f 中的任何撇号都会关闭 SQL 字符串,并且出现语法错误。
最佳答案
对于单引号转义问题,合理的解决方法可能是将引号加倍,因此您可以使用:
`sed "s/'/''/g" < "$f"`
包含文件 contents 而不是 cat
,并且对于 LIKE
中的第二次调用,您似乎打算使用文件名称 使用:
${f/"'"/"''"/}
包含 $f
的文字字符串内容而不是执行它,并加倍引号。 ${varname/match/replace}
表达式是 bash
语法,可能不适用于所有 shell;使用:
`echo "$f" | sed "s/'/''/g"`
如果您需要担心其他 shell。
该 SQL 中还有许多其他问题。
$f
。我很确定你不是故意的;我想你打算包括文字字符串。 (SELECT ...)
不仅仅是SELECT
。 LIKE
表达式也可能没有达到您的预期;您可能指的是 %
而不是 *
,因为 %
是 SQL 通配符。如果我也将反引号更改为 $()
(因为它更清晰、更易于阅读 IMO),请修复子查询语法并添加别名以消除列歧义,并改用 here-document传递给psql
的stdin,结果为:
psql $dbname $username <<__END__
UPDATE entries
SET content=$(sed "s/'/''/g" < "$f")
WHERE id=(SELECT e.id FROM entries e WHERE e.path LIKE '$(echo "$f" | sed "s/'/''/g")');
__END__
以上假设您使用的是相当现代的 PostgreSQL,并且 standard_conforming_strings = on
。如果不是,请更改正则表达式以使用 \
转义撇号而不是加倍它们,并在字符串前加上 E
,所以 O'Brien
变成 E'O\'Brien'
。在现代 PostgreSQL 中,它会变成 'O''Brien'
。
一般来说,我建议使用真正的脚本语言,如带有 DBD::Pg 的 Perl 或带有 psycopg 的 Python 来解决数据库的脚本问题。使用 shell 有点时髦。使用支持参数化语句的数据库接口(interface)编写此表达式会容易得多。
例如,我会这样写:
import os
import sys
import psycopg2
try:
connstr = sys.argv[1]
filename = sys.argv[2]
except IndexError as ex:
print("Usage: %s connect_string filename" % sys.argv[0])
print("Eg: %s \"dbname=test user=fred\" \"some_file\"" % sys.argv[0])
sys.exit(1)
def load_file(connstr,filename):
conn = psycopg2.connect(connstr)
curs = conn.cursor()
curs.execute("""
UPDATE entries
SET content = %s
WHERE id = (SELECT e.id FROM entries e WHERE e.path LIKE '%%'||%s);
""", (filename, open(filename,"rb").read()))
curs.close()
if __name__ == '__main__':
load_file(connstr,filename)
请注意,SQL 通配符 %
被加倍以对其进行转义,因此在最终 SQL 中会产生单个 %
。这是因为 Python 使用 %
作为它的格式说明符,所以文字 %
必须加倍才能转义它。
您可以简单地修改上面的脚本以接受文件名列表,连接到数据库一次,然后遍历所有文件名列表。这会快很多,尤其是当您在一次交易中完成所有操作时。使用 psql
脚本来做这件事真的很痛苦;你必须使用 bash 协同处理 as shown here ……这不值得麻烦。
关于用于更新 postgres 数据库的 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13436005/
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!