繁体   English   中英

如何将 mysql 默认文件 (my.cnf) 与 sqlalchemy 一起使用?

[英]how to use mysql defaults file (my.cnf) with sqlalchemy?

我想让 sqlalchemy 获取它所连接的 mysql 数据库的主机名、用户名和密码。

文档说 mysql 模式是这样指定的:

mysql_db = create_engine('mysql://scott:tiger@localhost/foo')

是否可以改为获取 mysql 默认文件(例如 /etc/my.cnf)并从那里获取登录详细信息? 我想避免在我的代码中嵌入用户名/密码。

以下是在Tomlal发布的sqlalchemy邮件列表中找到的结果:

http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg11241.html

from sqlalchemy.engine.url import URL

myDB = URL(drivername='mysql', host='localhost',
    database='my_database_name',
    query={ 'read_default_file' : '/path/to/.my.cnf' }
)
engine = create_engine(name_or_url=myDB)
# use the engine as usual, no password needed in your code file :)

如果你想使用MySQLdb,你可以使用ConfigParser解析ini文件:

sql_ini_fileparser = ConfigParser.RawConfigParser()
sql_ini_fileparser.read('example.cfg')
user = sql_ini_fileparser.get('client', 'user')
password = sql_ini_fileparser.get('client', 'password')

这是一个老问题,但接受的答案仍然强制您将主机名包含为字符串。 我一直在寻找一个能够读取my.cnf文件并从中获取主机名的解决方案。

我找到的第一件事就是这个页面,以及使用query={'read_default_file': 'my.cnf'}关键字构建URL的建议。 以下都等同于他的回答,它们都要求你明确传递主机名,但至少你可以从my.cnf文件中获取密码,端口,字符集和其他东西

engine = create_engine('mysql+pymysql://hostname', connect_args={'read_default_file': 'mu.cnf'})
engine = create_engine('mysql+pymysql://hostname?read_default_file=my.cnf')

在阅读了大部分源代码之后,我相信没有办法在不以某种方式将主机名传递给create_engine的情况下获取sqlalchemy引擎。

所以不知何故,你必须从其他地方获取主机名。 最简单的选择是使用环境变量,即host=os.getenv('DATABASE_URI')或者使用像karlo建议的configparser库来解析配置文件。 我比较喜欢的配置文件,因为你没有注入用户名和密码进入环境变量-这里的大致pymysql如何解析该文件中的源代码pymysql.connections.Connection

from configparser import Parser

read_default_group = 'client' # replace this if you're super special
read_default_file = '/etc/my.cnf' # replace this with the path you want to use

cfg = Parser()
cfg.read(defaults_file) 

def _config(key, arg=None):
    try:
        return cfg.get(read_default_group, key)
    except Exception:
        return arg

user = _config("user")
password = _config("password")
host = _config("host")
database = _config("database")
port = int(_config("port", 3306))
charset = _config("charset", "utf8mb4")
engine = create_engine(f'mysql+pymysql://{user}:{password}@{host}:{port}/{database}?charset={charset}')

我知道这是一个旧线程,但是当我尝试通过 cnf 文件中的套接字连接时,上面提到的解决方案对我不起作用。

相反,我做了以下有效的事情:

首先,我解析 cnf 文件以获取用户名和密码。

CnfFile = open('/directory/.MyCnfFile.cnf', 'r')
for Line in CnfFile:
    if Line.startswith("user"):
        User = Line.lstrip("user=")
        User = User.rstrip("\n")
    if Line.startswith("password"):
        Password = Line.lstrip("password=")
        Password = Password.rstrip("\n")

然后我使用套接字创建引擎。

engine = create_engine("mysql+pymysql://"+User+":"+Password+"@localhost?unix_socket=/var/run/mysqld/mysqld-socket.sock")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM