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 :)
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}')
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")
4条答案
按热度按时间nkoocmlb1#
下面是在sqlalchemy邮件列表中找到的结果,由Tom H发布:
http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg11241.html
1bqhqjot2#
如果要使用MySQLdb,可以使用ConfigParser解析ini文件:
ukdjmx9f3#
这是一个老问题,但公认的答案仍然要求您将主机名作为字符串包含在内。我一直在寻找一个解决方案,它可以读取
my.cnf
文件并从中获取主机名。我发现的第一件事是这个页面,以及使用
query={'read_default_file': 'my.cnf'}
关键字构建URL的建议。在阅读了大量的源代码之后,我相信如果不以某种方式将主机名传递到create_engine中,就不可能获得sqlalchemy引擎。
所以你必须从其他地方获取主机名。最简单的选择是使用环境变量即
host=os.getenv('DATABASE_URI')
,或者像karlo建议的那样使用configparser
库解析配置文件。我更喜欢配置文件,因为这样你就不必把用户名和密码注入到环境变量中--在这里'下面是pymysql在pymysql.connections.Connection
源代码中解析文件的大致方法k5hmc34c4#
我知道这是一个旧的线程,但当我试图通过cnf文件中的套接字进行连接时,上面提到的解决方案对我不起作用。
相反,我做了以下工作:
首先,我解析cnf文件以获取用户名和密码。
然后使用套接字创建引擎。