【问题标题】:sqlalchemy column named user, inconsistencysqlalchemy 列名为用户,不一致
【发布时间】:2014-04-04 23:12:39
【问题描述】:

我正在通过 sqlalchemy (python) 连接一个 postgresql 数据库。
在那里我有一个这样的表:

SELECT * from mytable;

 id | user | password |      host       | port 
----+------+----------+-----------------+------
  1 | abc  | def      |    127.0.0.1    |   21 

但是现在如果我尝试从我的代码中做一个等价的(我认为......)选择:

s = sql.select(columns=['user', 'password', ...]).select_from('mytable')

我得到数据库用户的名称,而不是用户列 (abc) 中的条目。

我还注意到,如果在 select 语句中明确指定了列名,psql 客户端会将用户字段重命名为“current_user”:

SELECT user, password, host, port FROM mytable;

 current_user | password |      host       | port 
--------------+----------+-----------------+------
 abc          | def      |    127.0.0.1    |   21

为了避免混淆,我是否必须重命名所有表格列?
或者 sqlalchemy 有没有针对这个问题提供解决方案?

这是表格规格:

\dS mytable;
                                Table "public.mytable"
  Column  |            Type             |                            Modifiers                             
----------+-----------------------------+--------------------------------------------------------------------
 id       | integer                     | not null default nextval('mytable_id_seq'::regclass)
 user     | character varying           | not null
 password | character varying           | not null
 host     | character varying           | not null
 port     | integer                     | not null

Indexes:
    "mytable_pkey" PRIMARY KEY, btree (id)

【问题讨论】:

    标签: python sql postgresql sqlalchemy


    【解决方案1】:

    常见错误。

    usercurrent_user 的别名,current_user 是 SQL 标准伪函数的关键字。

    如果您想要该名称的表或列,请使用 "user"(即双引号标识符)。或者选择不与reserved keywords 冲突的表/列名。

    ORM 和查询生成器应该自动对所有关键字(或所有标识符,因为它没有害处)进行双引号。不幸的是,大多数人都没有。

    【讨论】:

      猜你喜欢
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2023-03-24
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多