sqlalchemy的ipv6方式访问

问题:使用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"

 
 
 
 
大道至简
原文地址:https://www.cnblogs.com/liurong07/p/15544964.html