【问题标题】:Generate uuid for all the tables in a database为数据库中的所有表生成 uuid
【发布时间】:2019-02-13 06:18:39
【问题描述】:

我正在做一个项目,我需要使用 UUID 作为表名来生成一组动态表。所有在线资料都有助于为表中的列生成 UUID,而不是为表生成 UUID。

请帮我解决这个问题。

谢谢。

【问题讨论】:

  • @a_horse_with_no_name 我希望现在问题很清楚了。
  • 我已被分配创建一组包含相同数量的列和列名的表,使用 uuid 作为表名来区分 b/w 表,然后从集合中访问一个表并执行必要的更改@a_horse_with_no_name

标签: postgresql ddl


【解决方案1】:

如果我理解正确,您需要将每个表名重命名为 UUID。为此,请运行:

ALTER TABLE table_name RENAME TO uuid_generate_v1();

【讨论】:

    【解决方案2】:

    为什么有人会想要这么可怕的表名,这让我很吃惊,这可以使用动态 SQL 来完成。

    do
    $$
    declare
      l_count integer;
    begin
      for l_count in 1..5 loop
        execute format('create table %I (id integer primary key)', uuid_generate_v4());
      end loop;
    end;
    $$
    ;    
    

    format() 函数的 %I 占位符负责正确引用那些可怕的名称。

    由于 UUID 不是有效的 SQL 标识符,您现在必须在访问表时使用双引号,例如:

    select * 
    from "2dc9502b-1e49-4c6f-9675-71a900dabc91";
    

    一个更好的版本是通过将所有- 替换为_ 并使用字符前缀(因为SQL 标识符不允许以数字开头)来将UUID 转换为有效标识符,以便整个名称成为一个有效的标识符,不需要那些可怕的双引号:

    do
    $$
    declare
      l_count integer;
    begin
      for l_count in 1..5 loop
        execute format('create table %I (id integer primary key)', 't_'||replace(uuid_generate_v4()::text, '-', '_'));
      end loop;
    end;
    $$
    ; 
    

    上面创建的名称如下:t_2b526a62_a6bc_4c3a_bd52_f0db050c485c 这是一个有效的标识符,不需要任何特殊处理。

    【讨论】:

    • 感谢您的帮助。如果表名存储在变量中,您是否有任何想法如何访问烧瓶 sqlalchemy 中的表。
    • @AkshayBabu:不知道。我既不使用 SQLAlchemy 也不使用 Python
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2017-04-27
    • 2012-02-23
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多