Python 支持的 PostgreSQL PSQL 用户输入名称与无效整数混淆
Python backed PostgreSQL PSQL user INPUT name confused with invalid integer
简介:
我一直在为我在 Udacity 的关系数据库课程使用 Vagrant 运行 a Ubuntu VM 构建瑞士风格锦标赛的 Python 支持的 PostgreSQL 数据库。
问题:
为什么用户输入名称会导致整数错误?
流浪者:
vagrant@vagrant:/vagrant/tournament$ python tournament_test.py
1. countPlayers() returns 0 after initial deletePlayers() execution.
Traceback (most recent call last):
File "tournament_test.py", line 151, in <module>
testCount()
File "tournament_test.py", line 26, in testCount
registerPlayer("Chandra Nalaar")
File "/vagrant/tournament/tournament.py", line 50, in registerPlayer
cursor.execute("INSERT INTO players VALUES (%s)", (name,))
psycopg2.DataError: invalid input syntax for integer: "Chandra Nalaar"
LINE 1: INSERT INTO players VALUES ('Chandra Nalaar')
^
SQL:
CREATE TABLE players (player_id SERIAL UNIQUE PRIMARY KEY, player_name
VARCHAR(40));
Python:
def registerPlayer(player_name):
db = connect()
cursor = db.cursor()
cursor.execute("INSERT INTO players VALUES (%s)", (player_name,))
player_id = cursor.fetchone()[0]
db.commit()
cursor.close()
db.close()
Python(用户输入测试):
registerPlayer("Chandra Nalaar")
更新 1:
因此,我更改了执行语句语法以包含 PRMoureu 推荐的行规范,并返回了一个新错误。
流浪者:
vagrant@vagrant:/vagrant/tournament$ python tournament_test.py
1. countPlayers() returns 0 after initial deletePlayers() execution.
Traceback (most recent call last):
File "tournament_test.py", line 151, in <module>
testCount()
File "tournament_test.py", line 26, in testCount
registerPlayer("Chandra Nalaar")
File "/vagrant/tournament/tournament.py", line 50, in registerPlayer
cursor.execute("INSERT INTO players (player_name) VALUES (%s)",
(player_name,))
psycopg2.ProgrammingError: column "player_name" of relation "players" does
not exist
LINE 1: INSERT INTO players (player_name) VALUES ('Chandra Nalaar')
^
这让我得出结论,我没有使用我当前的锦标赛数据库。所以我回到 Vagrant 并使用 \i 导入了我的文件,这给了我一个新的错误。
流浪汉:
psql:tournament.sql:11: 错误:关系 "players" 已经存在
所以我用 DROP IF EXIST 命令更新了我的 SQL 文件,从另一个线程学习 Here 并且能够解决 Register_Player 错误。
感谢 PRMoureu
在您使用的 INSERT
语句中,它需要所有字段的值,首先是 player_id
(player_id
是一个整数)。
您需要指定一个 ID :
cursor.execute("INSERT INTO players VALUES (%s, %s)", (a_new_ID, player_name,))
或将语法更改为:
cursor.execute("INSERT INTO players (player_name) VALUES (%s)", (player_name,))
简介: 我一直在为我在 Udacity 的关系数据库课程使用 Vagrant 运行 a Ubuntu VM 构建瑞士风格锦标赛的 Python 支持的 PostgreSQL 数据库。
问题: 为什么用户输入名称会导致整数错误?
流浪者:
vagrant@vagrant:/vagrant/tournament$ python tournament_test.py
1. countPlayers() returns 0 after initial deletePlayers() execution.
Traceback (most recent call last):
File "tournament_test.py", line 151, in <module>
testCount()
File "tournament_test.py", line 26, in testCount
registerPlayer("Chandra Nalaar")
File "/vagrant/tournament/tournament.py", line 50, in registerPlayer
cursor.execute("INSERT INTO players VALUES (%s)", (name,))
psycopg2.DataError: invalid input syntax for integer: "Chandra Nalaar"
LINE 1: INSERT INTO players VALUES ('Chandra Nalaar')
^
SQL:
CREATE TABLE players (player_id SERIAL UNIQUE PRIMARY KEY, player_name
VARCHAR(40));
Python:
def registerPlayer(player_name):
db = connect()
cursor = db.cursor()
cursor.execute("INSERT INTO players VALUES (%s)", (player_name,))
player_id = cursor.fetchone()[0]
db.commit()
cursor.close()
db.close()
Python(用户输入测试):
registerPlayer("Chandra Nalaar")
更新 1: 因此,我更改了执行语句语法以包含 PRMoureu 推荐的行规范,并返回了一个新错误。
流浪者:
vagrant@vagrant:/vagrant/tournament$ python tournament_test.py
1. countPlayers() returns 0 after initial deletePlayers() execution.
Traceback (most recent call last):
File "tournament_test.py", line 151, in <module>
testCount()
File "tournament_test.py", line 26, in testCount
registerPlayer("Chandra Nalaar")
File "/vagrant/tournament/tournament.py", line 50, in registerPlayer
cursor.execute("INSERT INTO players (player_name) VALUES (%s)",
(player_name,))
psycopg2.ProgrammingError: column "player_name" of relation "players" does
not exist
LINE 1: INSERT INTO players (player_name) VALUES ('Chandra Nalaar')
^
这让我得出结论,我没有使用我当前的锦标赛数据库。所以我回到 Vagrant 并使用 \i 导入了我的文件,这给了我一个新的错误。
流浪汉: psql:tournament.sql:11: 错误:关系 "players" 已经存在
所以我用 DROP IF EXIST 命令更新了我的 SQL 文件,从另一个线程学习 Here 并且能够解决 Register_Player 错误。
感谢 PRMoureu
在您使用的 INSERT
语句中,它需要所有字段的值,首先是 player_id
(player_id
是一个整数)。
您需要指定一个 ID :
cursor.execute("INSERT INTO players VALUES (%s, %s)", (a_new_ID, player_name,))
或将语法更改为:
cursor.execute("INSERT INTO players (player_name) VALUES (%s)", (player_name,))