【发布时间】:2020-01-19 16:51:19
【问题描述】:
我正在尝试在 python 中创建一个培训应用程序来处理电影数据库,通过文本菜单添加电影详细信息,提示用户输入所有字段(电影名称、演员、公司等)。
我使用 PostgreSQL 作为数据库并在 Python 中导入 psycopg2。在数据库中,我使用了多对多的关系(因为同一个演员可以出演多部电影,等等)。因此,我有一个 movies 表(movie_id, name, company, year),一个 actors 表(actor_id, last_name, first_name , actor_ordinal) 和第三个中间表 actors_movies (actor_id, movie_id) 外键加入两者,用(actor_id, movie_id) 设置了主键。
然后我在 Python 中编写了这段代码(这是用户通过文本界面输入数据的最终阶段):
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))
query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
cursor.executemany(query2, [tuple(actor) for actor in actors])
query3 = 'INSERT INTO actors_movies (actor_id, movie_id) SELECT actor_id, movie_id FROM actors, movies ON CONFLICT DO NOTHING;'
cursor.execute(query3)
connection.commit()
connection.close()
它适用于 query1 和 query2。但是 query3(以中间 actors_movies 表为目标)复制了所有数据。每次我添加一部新电影时,中间表中都会包含其他电影中的所有演员,例如(加入后):
movie_id movie_name actor_id
1 The Matrix 1
1 The Matrix 2
1 The Matrix 3
1 The Matrix 4
2 Titanic 1
2 Titanic 2
2 Titanic 3
2 Titanic 4
3 Patriot 1
3 Patriot 2
3 Patriot 3
3 Patriot 4
所以,这是完全错误的,因为根据这张表,这三部电影中的所有四位演员都是错误的。 为什么会发生这种情况,如何消除这个问题?我找不到任何解决此问题的方法。
【问题讨论】:
标签: python postgresql psycopg2