【问题标题】:Need advice in changing MySQL connection options (Python)需要更改 MySQL 连接选项的建议 (Python)
【发布时间】:2018-06-21 22:14:58
【问题描述】:

几天来,我一直在尝试在 MySQL 中运行一些代码来填充我已经创建的数据库。最初在运行时出现错误 1251 : “客户端不支持服务器请求的身份验证协议;考虑升级 MySQL 客户端”。在我找到的 MySQL 文档和 stackoverflow 答案中,我被引导将默认的 insecureAuth 设置从默认的 false 更改为 true。这是我目前正在使用的代码...

import datetime
import MySQLdb as mdb
from math import ceil

def obtain_btc():
    now = datetime.datetime.utcnow()
    symbols = ['BTC', 'Crypto', 'Bitcoin', 'No Sector', 'USD', now, now]
    return symbols

def insert_btc_symbols(symbols, insecureAuth):
    db_host = 'localhost'
    db_user = 'natrob'
    db_pass = '**********'
    db_name = 'securities_master'
    con = mdb.connect(host=db_host,user=db_user,passwd=db_pass,db=db_name,{insecureAuth:true})
    column_str = "ticker, instrument, name, sector, currency, created_date, last_updated_date"
    insert_str = (("%s, ")*7)[:2]
    final_str = ("INSERT INTO symbols (%s) VALUES (%s)" % (column_str,insert_str))
    print (final_str,len(symbols))

    with con:
        cur = con.cursor()
        for i in range(0,int(ceil(len(symbols)/100.0))):
            cur.executemany(final_str,symbols[i*100:(i+1)*100-1])

if __name__ == "__main__":
    symbols = obtain_btc()
    insert_btc_symbols(symbols)

我最近收到错误:“关键字 arg 之后的非关键字 arg”。我试图切换顺序无济于事,这让我相信我可能没有正确更改默认设置。任何帮助或建议表示赞赏。谢谢。

【问题讨论】:

  • 您不需要更改连接的建议,您需要编写正确的python。您的缩进在问题中已关闭,但您还使用字符串格式来进行查询(坏主意,请查看 SQL 注入)并且您正在调用 insert_btc_symbols(symbols),即使您已将该函数定义为采用 2 个参数。
  • 那条评论听起来很苛刻,这是我无意的,但最重要的是,没有库能够解决此代码中的问题,您必须解决一些问题基本的python问题自己。在这里失败的不是您选择的库。
  • “在我找到的 MySQL 文档和 stackoverflow 答案中,我被引导将默认的 insecureAuth 设置从默认的 false 更改为 true。”然后向我们展示您找到的告诉您这样做的答案。你写的不是合法的 Python,很难猜出你真正想写什么,特别是因为 the docs 没有列出任何看起来相似的 connect,但是如果你向我们展示你正在尝试的代码要复制,应该很容易解释如何正确地做。
  • @roganjosh,我最初只有一个参数进入 insert_btc_symbols,但添加了 insecureAuth,因为 MySQL 推荐了它,而且它给了我一个不那么令人生畏的错误。我是数据库管理系统的新手,所以我边走边学。我编辑了代码以反映脚本中的间距。
  • @abarnert,以下链接是我获取代码的地方,我对其进行了修改,因为我没有直接从 HTML 中获取。代码从“获取列出的符号数据”部分开始,quantstart.com/articles/… 以下是建议更改 insecureAuth 的实例示例,github.com/mysqljs/mysql/issues/1574

标签: python mysql database connection insecure-connection


【解决方案1】:

问题似乎来自 {insecureAuth:true},它不是关键字参数。即变量=值。我不熟悉该库,但如果这是一个关键字,那么您应该能够将其设置为关键字或使用 ** 传递它

con = mdb.connect(host=db_host,user=db_user,passwd=db_pass,db=db_name,insecureAuth=True)

con = mdb.connect(host=db_host,user=db_user,passwd=db_pass,db=db_name,**{insecureAuth:true})

【讨论】:

  • 当我实施您的第一个建议时,我收到类型错误“insecureAuth is an invalid keyword argument for this function”……。在实施您的第二个建议时,我收到名称错误“未定义全局名称'insecureAuth”,并且 MySQL 还写道,'insecureAuth' 是一个未解决的参考。
  • @MikeyMike 你确定它是函数 connect() 的参数吗?你能把它删掉吗?
  • 是的,它是一个连接参数,默认设置为 false,但是,我需要找到一种方法将其设置为 true,以便通过不断抛出的错误消息。跨度>
  • @MikeyMike mysqlclient.readthedocs.io/_mysql.html?highlight=connect() 我没有看到它被列为参数。我错过了什么吗?
  • github.com/mysqljs/mysql#connection-options 我不确定这两者有什么不同,因为您的页面似乎非常关注我正在使用的 connect(),但 InsecureAuth 在这个上。
【解决方案2】:

我设法通过获取密码的公钥并使用它代替普通密码来使代码部分正常工作。这代替了使用 insecureAuth 参数。

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 2011-12-12
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多