[英]Python sqlalchemy (postgresql) not returning real table state
[英]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.