[英]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.