cursor.fetchall() 使用 PostgreSQL 在 Python 中只带来一行
cursor.fetchall() brings only one row in Python with PostgreSQL
我正在尝试在 python 中创建一个培训应用程序来处理电影数据库,通过提示用户输入所有字段(电影名称、演员、公司等)的文本菜单添加电影详细信息。 ).我使用 PostgreSQL 作为数据库并在 Python.
中导入 psycopg2
根据用户输入,我正在收集数据,然后我想将这些数据存储在我的数据库表中 'movies' 和 'actors'。对于一部电影,有几个演员。我有这个代码:
def insert_movie(name, actors, company, year):
connection = psycopg2.connect(user='postgres', password='postgres', database='movie')
cursor = connection.cursor()
query1 = "INSERT INTO movies (name, company, year) VALUES (%s, %s, %s);"
cursor.execute(query1, (name, company, year))
movie_id = cursor.fetchone[0]
print(movie_id)
query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
for actor in actors:
cursor.execute(query2, (tuple(actor)))
rows = cursor.fetchall()
actor_id1 = [row[0] for row in rows]
actor_id2 = [row[1] for row in rows]
print(actor_id1)
print(actor_id2)
connection.commit()
connection.close()
这非常适合在 query1 之后打印 movie_id。但是对于打印 actor_id2,我得到 IndexError: list index out of range.
如果我只在 query3 中留下 actor_id1,如下所示:
query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
for actor in actors:
cursor.execute(query2, (tuple(actor)))
rows = cursor.fetchall()
actor_id1 = [row[0] for row in rows]
print(actor_id1)
,我打印出以下结果:
movie_id --> 112
actor2_id --> 155
我用这段代码无法检索到actor1_id的问题,即154.
有人可以帮助正确使用 fetchall 吗?
好的,我找到答案了。 fetch 应该在循环内使用,因为我们应该对每一行执行 fetch 而不是在对所有行进行整个查询之后:
query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
actor_ids = []
for actor in actors:
cursor.execute(query2, (tuple(actor)))
actor_id = cursor.fetchone()[0]
actor_ids.append(actor_id)
print(actor_ids)
我正在尝试在 python 中创建一个培训应用程序来处理电影数据库,通过提示用户输入所有字段(电影名称、演员、公司等)的文本菜单添加电影详细信息。 ).我使用 PostgreSQL 作为数据库并在 Python.
中导入 psycopg2根据用户输入,我正在收集数据,然后我想将这些数据存储在我的数据库表中 'movies' 和 'actors'。对于一部电影,有几个演员。我有这个代码:
def insert_movie(name, actors, company, year):
connection = psycopg2.connect(user='postgres', password='postgres', database='movie')
cursor = connection.cursor()
query1 = "INSERT INTO movies (name, company, year) VALUES (%s, %s, %s);"
cursor.execute(query1, (name, company, year))
movie_id = cursor.fetchone[0]
print(movie_id)
query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
for actor in actors:
cursor.execute(query2, (tuple(actor)))
rows = cursor.fetchall()
actor_id1 = [row[0] for row in rows]
actor_id2 = [row[1] for row in rows]
print(actor_id1)
print(actor_id2)
connection.commit()
connection.close()
这非常适合在 query1 之后打印 movie_id。但是对于打印 actor_id2,我得到 IndexError: list index out of range.
如果我只在 query3 中留下 actor_id1,如下所示:
query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
for actor in actors:
cursor.execute(query2, (tuple(actor)))
rows = cursor.fetchall()
actor_id1 = [row[0] for row in rows]
print(actor_id1)
,我打印出以下结果:
movie_id --> 112
actor2_id --> 155
我用这段代码无法检索到actor1_id的问题,即154.
有人可以帮助正确使用 fetchall 吗?
好的,我找到答案了。 fetch 应该在循环内使用,因为我们应该对每一行执行 fetch 而不是在对所有行进行整个查询之后:
query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
actor_ids = []
for actor in actors:
cursor.execute(query2, (tuple(actor)))
actor_id = cursor.fetchone()[0]
actor_ids.append(actor_id)
print(actor_ids)