繁体   English   中英

Python SQLAlchemy PostgreSQL 名称中包含多个连字符的表的语法错误

[英]Python SQLAlchemy PostgreSQL SyntaxError for table with multiple hyphens in the name

我在名为public的模式中有一个表名users-activity-data 当我尝试使用pandas.read_sql查询表时:

engine = sqlalchemy.create_engine(conn)
pd.read_sql("""select * from public.users-activity-data""", engine)

我在"-"处或附近收到psycopg2.errors.SyntaxError

我无法更改表名并尝试在表名周围使用 [] 和``,但我遇到了同样的错误。 此外,对于模式中名称中没有连字符的其他表,它也能正常工作。

create table users-activity-data (id int);
ERROR:  syntax error at or near "-"
LINE 1: create table users-activity-data (id int);

create table "users-activity-data" (id int);
CREATE TABLE

import psycopg2

con = psycopg2.connect(dbname="test", host='localhost', user='postgres', port=5432)
cur = con.cursor()

cur.execute("""select * from public.users-activity-data""")
SyntaxError: syntax error at or near "-"
LINE 1: select * from public.users-activity-data

con.rollback()
cur.execute('select * from public."users-activity-data"')

每个标识符

SQL 标识符和关键字必须以字母(az,以及带变音符号和非拉丁字母的字母)或下划线 (_) 开头。 标识符或关键字中的后续字符可以是字母、下划线、数字 (0-9) 或美元符号 ($)。 请注意,根据 SQL 标准的字母,标识符中不允许使用美元符号,因此使用它们可能会降低应用程序的可移植性。 SQL 标准不会定义包含数字或以下划线开头或结尾的关键字,因此这种形式的标识符是安全的,不会与标准的未来扩展发生冲突。

...

还有第二种标识符:定界标识符或带引号的标识符。 它是通过将任意字符序列括在双引号 (") 中形成的。分隔标识符始终是标识符,而不是关键字。因此,“select”可用于指代名为“select”的列或表,而未加引号的 select 将被视为关键字,因此在需要表名或列名的地方使用时会引发解析错误。示例可以使用带引号的标识符编写,如下所示:

更新“我的表”设置“a”= 5;

带引号的标识符可以包含任何字符,但代码为零的字符除外。 (要包含一个双引号,写两个双引号。)这允许构造否则不可能的表或列名称,例如包含空格或&符号的名称。 长度限制仍然适用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM