在PythonAnywhere运行Python脚本连接Neo4j数据库失败求助
我写了一个简单的Python脚本,想用官方Neo4j库连接我的Neo4j数据库实例并获取数据。但在PythonAnywhere上运行时,连接失败,报错“Unable to retrieve routing information”。我确认URI、用户名和密码都是正确的——毕竟用Java写的桌面程序能成功连接数据库。
下面是完整的Python脚本:
from neo4j import GraphDatabase URI = "neo4j+s://uri:7687" AUTH = ("usn", "pwd") class PlayersNeo4jDatabaseManager: def __init__(self): try: self.driver = GraphDatabase.driver(URI, auth=AUTH) except Exception as ex: print(ex) def close(self): self.driver.close() def get_players_query(self, tx): query = "MATCH (p:Player) RETURN p LIMIT 1;" players = tx.run(query) for player in players: print(player) def get_players(self): with self.driver.session(database="neo4j") as session: session.read_transaction(self.get_players_query) playersNeo4jDatabaseManager = PlayersNeo4jDatabaseManager() playersNeo4jDatabaseManager.get_players()
我试过换成neo4j://、neo4j+ssc://和bolt://协议,但都没用。
别担心,我来帮你梳理几个可能的原因和对应的解决办法:
检查PythonAnywhere的网络访问限制
PythonAnywhere对出站网络有默认限制,常见的80、443端口是开放的,但Neo4j默认的7687端口可能不在允许列表里。你可以试试把Neo4j实例的连接端口改成443(不少云Neo4j服务商支持这个配置);或者确认你的Neo4j服务有没有IP白名单限制,把PythonAnywhere的服务器IP地址添加到白名单中——毕竟本地能连,大概率是网络访问权限的问题。确认Neo4j驱动版本一致性
有时候本地和PythonAnywhere环境的Neo4j驱动版本不一样,也会引发奇怪的连接问题。你可以在本地和PythonAnywhere的控制台分别运行pip show neo4j查看版本号,确保两边使用的是同一个稳定版本。如果版本差异大,就在PythonAnywhere上重新安装和本地匹配的驱动版本。尝试直接连接模式(针对单实例)
报错“Unable to retrieve routing information”通常和集群路由逻辑有关,如果你用的是Neo4j单实例,不妨试试跳过路由,用直接连接的方式创建驱动:from neo4j import DirectDriver # 替换原来的driver初始化代码 self.driver = DirectDriver(URI, auth=AUTH)这样可以绕开路由信息获取的步骤,直接建立连接。
增加错误日志的详细度
你现在的异常捕获只打印了基础错误信息,很难定位具体问题。建议修改代码,打印完整的错误堆栈:except Exception as ex: import traceback traceback.print_exc()完整的错误信息能帮你更快找到问题根源,比如是证书问题、网络超时还是其他原因。
备注:内容来源于stack exchange,提问作者Muhab Joumaa

