docker exec -tiu postgres some_db_container psql db_name
这是一个方便的命令,可以连接到任何有权访问的docker容器,而无需发现应用程序用来连接的用户名和密码.
麻烦的是,此时分配的TTY是疯了.它不知道终端有多大,当它试图包裹线时它不会断线,如果你试图在中间编辑线,它就会完全脱离轨道.大多数情况下,在文本编辑器中编写查询并粘贴它更容易.
我想也许是因为在制作容器时没有分配TTY,但是tty: true在docker-compose中似乎没有效果.
我很惊讶我甚至在互联网上找不到这个问题的讨论,因为唯一的另一种连接方式是知道容器的IP和用户连接的凭据.
这有什么问题吗?每次我想调查一个问题时,我宁愿不必挖掘生产密码,如果我可以解决这个问题,我可以作为postgres用户连接.
假设我有下表:
CREATE TABLE test (
arr_column VARCHAR[] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
这不会阻止在插入行时将数组的值设置为 NULL。所以,我想要一个约束来强制执行这个规则。我的尝试如下:
CREATE TABLE test (
arr_column VARCHAR[] NOT NULL
CHECK (NOT (ARRAY[NULL]::VARCHAR[] <@ arr_column))
)
Run Code Online (Sandbox Code Playgroud)
但不幸的是,如果我插入,这不会失败:
INSERT INTO test (ARRAY['some_string', NULL]::VARCHAR[])
Run Code Online (Sandbox Code Playgroud) 我必须扩展正常的 GeoJSON 格式以添加一些不受支持的多边形,如 Circle。
{
"type": "Circle",
"radius" : 0.001,
"coordinates": [
5.417075157165527,
43.29129488122568
]
}
Run Code Online (Sandbox Code Playgroud)
这是一个例子。坐标标记圆心,半径表示半径(以米为单位)。
在 PostGis Docs 和 Stackoverflow 上搜索,要绘制一个圆,您必须使用 ST_BUFFER。
所以我使用:
ST_Buffer(ST_GeomFromGeoJSON(<center of circle>),0.001, 'quad_segs=16')
Run Code Online (Sandbox Code Playgroud)
你知道吗,这只能在 0,0(非洲附近)画一个圆。其他位置添加了改变椭圆形状的扭曲。
我用的是 4326。
我试图搜索(即使在这里),但我无法找到一个解决方案来简单地绘制一个圆,避免投影或转换它。
这里唯一的帖子是:如何在 postgis 中以米为单位创建一个圆圈? 但它很旧,该解决方案不起作用。
我已经知道如何在数据库中存储图像,只需bytea在我的表中使用类型
我已经可以通过我的项目 .net Core 中的代码将图像保存到数据库中,我刚刚获取图像url并像那里一样保存:
using (HttpResponseMessage res = await client.GetAsync(photo_url))
using (HttpContent content = res.Content) {
byte[] imageByte = await content.ReadAsByteArrayAsync();
using (NpgsqlConnection conn = new NpgsqlConnection("ConnectionString")) {
conn.Open();
using (NpgsqlTransaction tran = conn.BeginTransaction())
using (NpgsqlCommand cmd = new NpgsqlCommand("Photo_Save", conn)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("photo", NpgsqlTypes.NpgsqlDbType.Bytea, imageByte);
cmd.ExecuteScalar();
tran.Commit();
}
}
Run Code Online (Sandbox Code Playgroud)
它运作良好
但我需要从我的电脑保存到表格图像
有没有什么方法可以在没有主机或任何其他项目的代码的情况下将图像上传到数据库中,只需使用本地图片并连接到Postges DB?
我在树结构中有一个叶节点,我需要一个 Postgres 查询来递归遍历父节点以获得叶节点的完整路径。
我的表看起来像这样 - 问题是没有特定的根节点(即最顶层的经理最终互相报告)
+----+------------+-------+
| id | manager_id | name |
+----+------------+-------+
| 1 | 2 | Matt |
| 2 | 1 | Simon |
| 3 | 1 | John |
| 4 | 2 | Bob |
| 5 | 4 | Bill |
+----+------------+-------+
Run Code Online (Sandbox Code Playgroud)
对于像比尔这样的用户,(id=5)我正在寻找他们的报告线:
Matt > Simon > Bob > Bill(理想情况下,当它尝试前往已遍历的节点时,它会停在 Matt 处)
经过几天的寻找,并尝试了我找到的所有内容后,我来这里询问如何使用 PostGis 计算 Postgres 上两点之间的距离。我有一张名为“位置”的表。该表有一个点类型的“坐标”列。当用户在应用程序上插入值时,我需要获取按近距离排序的位置。我知道我需要使用 ST_Distance,但每次我尝试投射坐标点时我都不能。我需要以公里为单位的结果。
我尝试:
SELECT ST_Distance('POINT(0.0 0.0)', ST_GeomFromText(location.coordenate)) FROM app.location as location;
在 PL/pgSQL 函数中,我想捕获错误。例如,当我将文本转换为数字时,我收到错误(我在 中运行它psql,但在 Postico GUI 客户端中收到相同的错误):
select 'a'::numeric;
ERROR: invalid input syntax for type numeric: "a"
LINE 1: select 'a'::numeric;
^
Run Code Online (Sandbox Code Playgroud)
为了捕获这个错误,我做了一个例外子句,如下所示:
CREATE OR REPLACE FUNCTION public.to_number(input text) RETURNS numeric
AS $$
BEGIN
RETURN input::numeric;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END
$$
LANGUAGE plpgsql
IMMUTABLE
RETURNS NULL ON NULL INPUT
;
Run Code Online (Sandbox Code Playgroud)
然而,我不喜欢这个条件WHEN OTHERS。
如何将错误消息映射到附录 A. PostgreSQL 错误代码ERROR: invalid input syntax for type numeric: "a"中提到的消息?
我想在转换为numeric且没有其他条件时捕获转换错误(因为上述函数是简化函数)。
我感觉我失去了一些东西,但是什么呢?
我有生成一个 sql 语句的代码,如下所示:
SELECT * FROM items WHERE id IN (X, Y, Z)
Run Code Online (Sandbox Code Playgroud)
其中 x、y、z 是整数。
在一种情况下,我的数组只有一个整数,导致生成此整数
SELECT * FROM items WHERE id in (X)
Run Code Online (Sandbox Code Playgroud)
理想情况下这应该是where id = x
与只有 1 项的情况相比,in调用是否会对性能产生影响?=
我在尝试保存已格式化为 GeoJSON 的多边形时遇到问题,问题是我将多边形作为坐标数组数组,但 postgres 多边形字段需要一个元组数组,但 javascript 没有支持元组,因此我不知道如何将数据插入 Postgres。
postgres 如何获取数据的示例:
INSERT INTO table VALUES(default, '[(x,y), (x,y)]');
我拥有的数据示例:
"coordinates": [
[
[
49.5703125,
59.5343180010956
],
[
54.84375,
54.77534585936447
],
[
63.28125,
59.5343180010956
],
[
54.84375,
61.77312286453146
],
[
49.5703125,
60.930432202923335
],
[
49.5703125,
59.5343180010956
]
]
]
Run Code Online (Sandbox Code Playgroud)
尝试将数组保存到 postgres 时遇到的错误:
{
"message": "invalid input syntax for type polygon: \"{{\"-64.1892249612655\",\"-31.4212119274207\"},{\"-64.1896863245919\",\"-31.4223122073094\"},{\"-64.1900957427429\",\"-31.423283040535\"},{\"-64.1901970936061\",\"-31.4235231632172\"},{\"-64.190677427225\",\"-31.4246610035708\"},{\"-64.1892249612655\",\"-31.4212119274207\"}}\"",
"name": "QueryFailedError",
"length": 353,
"severity": "ERROR",
"code": "22P02",
"file": "float.c",
"line": "542",
"routine": "float8in_internal",
"query": "INSERT INTO \"zones\"(\"title\", \"boundary_points\", \"created_at\", \"updated_at\", \"iconFileId\", …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 COPY 命令将数据从表导出到 csv。这是我的代码
String copyQuery="COPY "+tableName+ " TO STDOUT WITH DELIMITER '~' CSV HEADER";
System.out.println(copyQuery);
try {
FileWriter fw=new FileWriter(FilePath);
new CopyManager((BaseConnection) conPost)
.copyOut(
copyQuery, fw
);
fw.close();
logger.info("postgres side csv generated");
}
Run Code Online (Sandbox Code Playgroud)
当我查看 CSV 时,输出如下:- 1~vignesh~java
但是,我更喜欢将字符串放在双引号中:- 1~"vignesh"~"java"
我怎样才能实现这个目标????
提前致谢
postgresql ×9
sql ×5
postgis ×3
plpgsql ×2
bytea ×1
docker ×1
geometry ×1
javascript ×1
typeorm ×1