如何从数据库URL中解析出MySQL数据库名称

14

DATABASE_URL - MYSQL://用户名:密码@主机名:端口号/数据库名称

错误:数据库名称没有属性。

if 'DATABASE_URL' in os.environ:
  url = urlparse(os.getenv['DATABASE_URL'])
 g['db'] = mysql.connector.connect(user=url.username,password=url.password, host=url.hostname ,port=url.port,path=url.path[1:])
4个回答

26
首先,url.host的结果是:

AttributeError: 'ParseResult'对象没有属性'host'

应该使用url.hostname代替。

要从提供的URL中获取database_name,请使用path

url.path[1:]

另一种处理这个问题的方法是使用sqlalchemy的make_url()函数,这是一个“不要重复造轮子”的替代方案,它是基于正则表达式的。
In [1]: from sqlalchemy.engine.url import make_url

In [2]: url = make_url("MYSQL://username:password@host:100/database_name")

In [3]: print url.username, url.password, url.host, url.port, url.database
username password host 100 database_name

我修改了我的代码:g['db'] = mysql.connector.connect(user=url.username,password=url.password, host=url.hostname ,port=url.port,path=url.path[1:]),但现在它给我一个错误:AttributeError("Unsupported argument '{0}'".format(key)) app[stderr.0]: AttributeError: Unsupported argument 'path'。 - guri
在这种情况下,使用 url.drivername 作为 drivername 属性(即 "mysql")。 - Parzival

15

使用标准的Python3库

from urllib.parse import urlparse

dbc = urlparse('mysql://username:password@host:3306/database_name')
print(dbc.scheme, dbc.hostname, dbc.port, dbc.username, dbc.password, dbc.path.lstrip('/'))
#output: mysql host port username password database_name

1

将路径更改为“database”:url.path [1:] 对我有用。


-1

更新于2022年11月16日

Python 3.10.6 (main, Aug 11 2022, 13:47:18) [Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from sqlalchemy.engine.url import make_url
>>> url = make_url("mysql+pymysql://username:password@host:3306/database_name?charset=utf8")
>>> print(url.get_backend_name(),
...       url.get_driver_name(),
...       url.username,
...       url.password,
...       url.host,
...       url.port,
...       url.database,
...       url.query)
mysql pymysql username password host 3306 database_name immutabledict({'charset': 'utf8'})
>>>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接