代码之家  ›  专栏  ›  技术社区  ›  Micah Armantrout

如何使用sql脚本将数据插入到代码优先的数据库中?

  •  1
  • Micah Armantrout  · 技术社区  · 4 月前

    我有一个首先由代码创建的表,我需要通过Postgres工具将数据插入其中。我的问题是,由于代码优先,EF是创建唯一密钥的人。那么,我如何使用postgres工具在表中插入数据,而不需要EF呢?我确实看到实体框架正在使用数据库中定义的序列,我可以在插入语句中使用它吗?

    1 回复  |  直到 4 月前
        1
  •  1
  •   Zegarek    4 月前

    您可以检查EF生成的整个数据库模式 pg_dump -s ,或询问 psql 用以下方式描述单个对象 \d meta-command .
    demo at db<>fiddle

    testdb=# create table test(  id int primary key generated by default as identity
                               , id2 serial);
    CREATE TABLE
    testdb=# \d test
                                 Table "public.test"
     Column |  Type   | Collation | Nullable |              Default
    --------+---------+-----------+----------+-----------------------------------
     id     | integer |           | not null | generated always as identity
     id2    | integer |           | not null | nextval('test_id2_seq'::regclass)
    Indexes:
        "test_pkey" PRIMARY KEY, btree (id)
    

    我提到这两个工具是因为它们都与标准的PostgreSQL构建捆绑在一起,但其他工具像 pgAdmin , DBeaver DataGrip ,都提供类似的功能。

    如果你只需要使用默认值而不查找它, insert..values 接受a default 关键字代替值:

    insert into test(id)values(default)returning *;
    
    身份证件 id2
    1. 1.

    或者跳过该列:在上面的示例中,我只针对 id ,所以 id2 单独使用默认值。请注意,我必须在第一个括号中的目标列表和第二个括号的值列表中跳过它。

    你也可以用 pg_get_serial_sequence() 只要它是一个 serial generated [always|by default] as identity 列,或者序列通过以下方式连接到它 [create|alter] sequence..owned by :

    insert into test(id,id2)
    values(  nextval(pg_get_serial_sequence('test','id'))
           , nextval(pg_get_serial_sequence('test','id2')))
    returning *;
    
    身份证件 id2
    2. 2.