【发布时间】:2012-12-22 14:07:40
【问题描述】:
我正在尝试使用 SQLAlchemy Core 中的 SQL 语句更新 PostgreSQL 表上的整数数组。我第一次尝试使用查询生成器,但也不知道该怎么做。我相信我使用的方言 Psycopg2 可以自动将数组形成 PostgreSQL 可以接受的格式。
这是表架构:
CREATE TABLE surveys (
survey_id serial PRIMARY KEY,
question_ids_ordered INTEGER[],
created_at TIMESTAMP NOT NULL DEFAULT now(),
);
还有 SQLAlchemy 语句:
survey_id = 46
question_ids_ordered = [237, 238, 239, 240, 241, 242, 243]
with engine.begin() as conn:
conn.execute("""UPDATE surveys
SET question_ids_ordered = %s
WHERE survey_id = %s""",
question_ids_ordered, survey_id)
我收到的回溯是:
Traceback (most recent call last):
File "foo.py", line 16, in <module>
res = add_question_to_group(current_user, 46, 358, question_ids_ordered, new_group_name="Jellyfish?")
File "/vagrant/workspace/panel/panel/survey.py", line 80, in add_question_to_group
question_ids_ordered, survey_id)
File "/home/vagrant/.virtualenvs/project/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 664, in execute
params)
File "/home/vagrant/.virtualenvs/project/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 808, in _execute_text
statement, parameters
File "/home/vagrant/.virtualenvs/project/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 831, in _execute_context
None, None)
File "/home/vagrant/.virtualenvs/project/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 827, in _execute_context
context = constructor(dialect, self, conn, *args)
File "/home/vagrant/.virtualenvs/project/lib/python2.6/site-packages/sqlalchemy/engine/default.py", line 513, in _init_statement
for p in parameters]
sqlalchemy.exc.StatementError: 'int' object is not iterable (original cause: TypeError: 'int' object is not iterable) 'UPDATE surveys\n SET question_ids_ordered = %s\n WHERE survey_id = %s' ([237, 238, 239, 240, 241, 242, 243], 46)
我做错了什么?
【问题讨论】:
-
如果您使用原始 SQL,为什么不完全放弃 ORM?请阅读docs。
-
在这个例子中我没有使用 ORM。我也没有在我的应用程序的任何地方使用 ORM;我使用的是 SQLAlchemy Core,而不是 ORM。
-
ORM 是 SQLAlchemy 中最好的部分,因为它为您提供了可移植性和可重用查询(使用字符串连接构建原始 SQL 很糟糕)。出于好奇,SQLAlchemy Core 为您提供了 Psycopg2 没有提供的哪些功能?
-
我用多个 VALUES 子句做了很多 INSERT。手工操作意味着大量冗余代码(或我不特别喜欢的一次性功能)。 SQLAlchemy 使这些类型的插入变得容易,此外还使用了一个连接池,这很方便。
标签: python postgresql sqlalchemy