zoukankan      html  css  js  c++  java
  • 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"

     
     
     
     
    大道至简
  • 相关阅读:
    75分以下是文盲
    罗永浩最近怎么了
    北京奥运会赛事项目竞赛日程表
    从今天开始我的blog增加计数器
    07工作总结
    五道脑筋测试题,全答对的是天才
    转:国家名字的含义
    我的新装备双狂
    上海海鲜自助:喜多屋vs古象大酒店
    因为有了爱
  • 原文地址:https://www.cnblogs.com/liurong07/p/15544964.html
Copyright © 2011-2022 走看看