我正在针对为用户提供数据库的应用程序构建集成测试。为其创建的用户不是超级用户,并且无权访问 schema_information.tables,因为当我尝试以下脚本时:
SELECT table_name
FROM information_schema.tables
WHERE table_schema='{schema}'
Run Code Online (Sandbox Code Playgroud)
我得到 0 的回报,因为该用户没有权限,我应该这样做。
我正在尝试查询数据库以验证创建的表和列。我可以使用以下脚本通过系统目录获取表名列表:
SELECT tablename
FROM pg_catalog.pg_tables
WHERE schemaname = '{schema}'
Run Code Online (Sandbox Code Playgroud)
这会按照我想要的方式输出表名:
业务、位置、人员等...
我找不到带有系统目录的脚本,然后才能找到每个表的列名(作为奖励,数据类型)。到目前为止,我已经尝试了以下方法:
SELECT attname, format_type(atttypid, atttypmod) AS type
FROM pg_attribute
WHERE attrelid = 'business'
Run Code Online (Sandbox Code Playgroud)
这是错误:
ERROR: invalid input syntax for type oid: "business"
LINE 1: ...od) AS type FROM pg_attribute WHERE attrelid = 'business'
^```
Run Code Online (Sandbox Code Playgroud)
还试过:
SELECT
a.attname as "Column",
pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
FROM
pg_catalog.pg_attribute a
WHERE
a.attnum > 0
AND NOT a.attisdropped
AND …Run Code Online (Sandbox Code Playgroud) 我正在尝试查询对象数组中存在的键。这种结构:
column jdata
{"name": "Somedata",
"array": [ {"name":"bla1", "attr": "somevalue"},
{"name":"bla2", "otherdata": "somevalue2"},
{"name":"bla3", "otherdata": "somevalue"}
],
"otherstuff": "stuff"
}
Run Code Online (Sandbox Code Playgroud)
现在我在jdata->'name'or上做 btree (jdata->'datetime')::cast,效果很好。
我也做 json_path_opsjdata->'array' @> '[{"name":"bla3"}]'真正的魅力所在。
我的问题是attr键可以在数组中的任何对象中,如果键存在,我关心记录,但是值几乎可以是任何东西。有没有办法查询这个?有没有办法索引它?我想做jdata->'array' @> '[{"attr": ?}]'或者也许? 'attr'可以在数组中以某种方式使用?
目前我正在考虑一个扫描键的触发器,然后将它移动到一个带有 true 或 false 或其他什么的标题,然后一个普通的 btree 将工作。有没有更好的办法?我需要在平均站点上编辑大约 50 万条记录才能添加这些值。
请给我指明一个方向。
我正在为在某些方面类似于 Uber 的服务开发后端(只是为您提供一般上下文的简化)。用户将预订乘车,因此用户将定义接送地点。这些位置将是一个城市的地址(未来可能会有多个城市)。我将从前端/应用程序收到的位置将采用纬度、经度和 google-maps-verified 地址的形式。
我想知道我是否应该将这些位置存储为一个单独的表,或者我是否应该将这些位置嵌入到我需要它们的任何表中。例如,bookings桌子将有一个上车地点和一个下车地点。这些应该只是对locations表的引用,还是应该添加更多列来存储位置?我将需要每个位置至少 3 列(纬度、长度、地址字符串),如果我们决定将街道地址分解为更多组件,则可能会有更多列。
我认为这两种方法在内存和时间性能之间进行权衡:
bookings带有这些 ID 的表。如果我们在边界框中有数百或数千个位置,这可能不是一个好方法。但同样,我不确定尝试优化此操作的效用。我不确定我需要按位置搜索的频率。似乎不是那么频繁,所以我不会以任何方式获得/失去太多。在我看来,没有基于时空权衡的有力论据。我还应该考虑其他方面吗?例如:设计清晰、易于开发、灵活性和可扩展性。如果模型需要改变,单独的表格方法似乎提供了更多的结构和更大的灵活性的机会。例如,将街道地址分解为多个组成部分(街道、城市、州)可能是有益的。如果我们要在其他表中使用位置列,我们就不太可能这样做(我们需要已经使用至少 3 列,并且将地址分成 3 个组件,使这个数字变为 5)。关于灵活性:在未来,我们可能会有多点骑行。拥有位置表将对此有所帮助。
我倾向于单独的表格,但我没有看到支持或反对它的有力论据。我还缺少其他论点吗?
不确定以下细节是否相关,但我将使用 postgresql 作为 RDBMS,使用 sqlalchemy 作为 ORM 来查询数据库。
我有一列 type JSONB,其中每一行都包含一个带有对象数组的 JSON,例如:
[
{
"grade": "4.44/5",
"endYear": 2011,
"startYear": 2006,
"userId": "defg"
},
{
"grade": "9.133/10",
"endYear": 2010,
"startYear": 2006,
"userId": "abcd"
}
]
Run Code Online (Sandbox Code Playgroud)
我正在尝试将这些JSONB集合扩展为行,例如:
| grade | startYear | endYear | userId |
-------------------------------------------
| 4.44/5 | 2006 | 2011 | defg |
| 9.133/10 | 2006 | 2010 | abcd |
-------------------------------------------
Run Code Online (Sandbox Code Playgroud)
..使用以下查询:
WITH arr AS (SELECT jsonb_array_elements(jsonbrecords) AS jsons
FROM "table-with-jsonb"),
lines AS (
SELECT x.*
FROM arr, jsonb_to_record(jsons) AS x(
"field1" …Run Code Online (Sandbox Code Playgroud) 我正在学习 PostgreSQL (9.6) 并且对我收到的错误有点困惑。如果我尝试创建以下函数 II 会收到以下错误。
create or replace FUNCTION HelloWorld ()
RETURNS TABLE(HelloCol text, WorldCol text) AS $$
SELECT 'Hello' , 'World' ;
$$
LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
错误:
ERROR: return type mismatch in function declared to return record
DETAIL: Final statement returns unknown instead of text at column 1.
CONTEXT: SQL function "helloworld"
SQL state: 42P13
Run Code Online (Sandbox Code Playgroud)
如果我将文本转换为文本,它可以正常工作。
create or replace FUNCTION HelloWorld ()
RETURNS TABLE(HelloCol text, WorldCol text) AS $$
SELECT cast('Hello' as text) , cast('World' as Text);
$$
LANGUAGE …Run Code Online (Sandbox Code Playgroud) 我想知道 postgresql 中表的最后修改日期。在 SQL Server 中可以得到使用
SELECT modify_date FROM sys.objects
Run Code Online (Sandbox Code Playgroud)
如何在 Postgres 中得到同样的东西?我正在使用 Postgres 9.4
我需要根据索引日期字段从 13 亿行表中删除大约 4 亿行。
该表的大小约为 800 GB。
在不造成不利影响的情况下删除数据的最有效方法是什么?该表正在大量使用,这意味着大量插入和更新(不会影响要删除的行)。
有一个维护窗口,这将是最快的,但我可能无法获得足够大的维护窗口。另一方面,我可以花时间进行删除,因此不会着急。
作为一名分析师,我喜欢有能力work_mem在大型排序或索引构建即将到来时出现。
作为 DBA,随机用户能够在运行时请求任意数量的系统资源的想法有点吓人。我确认一个基本上不需要许可的新创建用户可以请求尽可能多的请求work_mem。估计一次只需要几个贪婪的用户就可以让其他用户挨饿,这很可怕。
有没有办法限制work_mem用户可以请求?
当我尝试
REVOKE ALL PRIVILEGES ON DATABASE postgres from admin;
Run Code Online (Sandbox Code Playgroud)
但此后用户admin仍然可以postgres通过远程连接pgadmin。
如何完全撤销用户对数据库的访问权限?
语境:
PostgreSQL 10,users表有3667438条记录,users表有一个名为social的JSONB,我们通常使用对计算函数输出进行索引的策略,这样我们就可以将信息聚合到一个单独的索引中。的输出engagement(social)函数是双精度数字类型。
问题:
有问题的条款是 ORDER BY engagement(social) DESC NULLS LAST,还有一个 btree 索引idx_in_social_engagement with DESC NULLS LAST附加到这个数据。
快速查询:
EXPLAIN ANALYZE
SELECT "users".* FROM "users"
WHERE (follower_count(social) < 500000)
AND (engagement(social) > 0.03)
AND (engagement(social) < 0.25)
AND (peemv(social) < 533)
ORDER BY "users"."created_at" ASC
LIMIT 12 OFFSET 0;
Limit (cost=0.43..52.25 rows=12 width=1333) (actual time=0.113..1.625
rows=12 loops=1)
-> Index Scan using created_at_idx on users (cost=0.43..7027711.55 rows=1627352 width=1333) (actual time=0.112..1.623 rows=12 loops=1)
Filter: ((follower_count(social) < 500000) AND …Run Code Online (Sandbox Code Playgroud) postgresql performance order-by postgresql-10 postgresql-performance