首页 文章

如何使用sqlalchemy的mysql默认文件(my.cnf)?

提问于
浏览
2

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

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

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

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

3 回答

  • 3

    以下是在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 :)
    
  • 1

    如果你想使用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')
    
  • 6

    这是一个老问题,但接受的答案仍然强制您将主机名包含为字符串 . 我一直在寻找一个读取 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') 或使用 configparser 库解析配置文件,如karlo建议的那样 . 我更喜欢配置文件,因为那时你大致不知道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}')
    

相关问题