问题:使用sqlalchemy访问mysql数据库时候,如果传入ipv6地址报错
使用sqlalchemy访问mysql数据库时候,一直使用的ipv4地址,当url中ip换成ipv6地址时候,出现报错
ValueError: invalid literal for int() with base 10: 'dc92:ff:1:1:215:86:187:3307'
定位
跟着如下报错信息一层一层找到sqlalchemy/engine/url.py的line-771行函数_parse_rfc1738_args
此时发现这是解析url的函数,其中ipv4和ipv6的解析格式不一致
def _parse_rfc1738_args(name): pattern = re.compile( r""" (?P<name>[\w\+]+):// (?: (?P<username>[^:/]*) (?::(?P<password>[^@]*))? @)? (?: (?: \[(?P<ipv6host>[^/\?]+)\] | (?P<ipv4host>[^/:\?]+) )? (?::(?P<port>[^/\?]*))? )? (?:/(?P<database>[^\?]*))? (?:\?(?P<query>.*))? """, re.X, )
从代码段可以看出,ipv6的解析时候,ip是加了中括号的。于是恍然大悟,url的格式不能照搬ipv4。
把ipv6的url修改后问题就解决了。
总结
slqchemy中,ipv4的url格式/ipv6的url格式正确如下:
ipv4: url = "mysql+pymysql://username:password@ip:port/db_name"
ipv6: url = "mysql+pymysql://username:password@ [ ip ] :port/db_name"