**TypeError: 'NoneType' object is not iterable**
**TypeError: 'NoneType' object is not iterable**
我想使用 ssh 隧道访问 Mysql 数据库。
不幸的是,这段代码的架构似乎不支持我的查询格式,因为该函数似乎与我的查询格式不兼容。
/Users/peter/PycharmProjects/MySqlLocalhostTest/venv/lib/python3.10/site-packages/paramiko/transport.py:236: CryptographyDeprecationWarning: Blowfish has been deprecated
"class": algorithms.Blowfish,
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/code.py", line 90, in runcode
exec(code, self.locals)
File "<input>", line 96, in <module>
File "<input>", line 65, in run_query
File "/Users/peter/PycharmProjects/MySqlLocalhostTest/venv/lib/python3.10/site-packages/pandas/io/sql.py", line 399, in read_sql_query
return pandas_sql.read_query(
File "/Users/peter/PycharmProjects/MySqlLocalhostTest/venv/lib/python3.10/site-packages/pandas/io/sql.py", line 2081, in read_query
columns = [col_desc[0] for col_desc in cursor.description]
TypeError: 'NoneType' object is not iterable
像 (Select * From Table) 这样的简单语句可以完美地工作。
我必须在 mysql 语法或函数中更改什么才能使它工作?
抱歉我是个菜鸟。如果有任何建议或帮助,我将不胜感激。
import pandas as pd
import pymysql
import logging
import sshtunnel
from sshtunnel import SSHTunnelForwarder
ssh_host = '172.xxx.xxx.xxx'
ssh_username = 'root'
ssh_password = 'xxxxxxx'
database_username = 'root'
database_password = 'xxxxxxxx'
database_name = 'analysis-db'
localhost = '127.0.0.1'
def open_ssh_tunnel(verbose=False):
"""Open an SSH tunnel and connect using a username and password.
:param verbose: Set to True to show logging
:return tunnel: Global SSH tunnel connection
"""
if verbose:
sshtunnel.DEFAULT_LOGLEVEL = logging.DEBUG
global tunnel
tunnel = SSHTunnelForwarder(
(ssh_host, 22),
ssh_username=ssh_username,
ssh_password=ssh_password,
remote_bind_address=('127.0.0.1', 3306)
)
tunnel.start()
def mysql_connect():
"""Connect to a MySQL server using the SSH tunnel connection
:return connection: Global MySQL database connection
"""
global connection
connection = pymysql.connect(
host='127.0.0.1',
user=database_username,
passwd=database_password,
db=database_name,
port=tunnel.local_bind_port
)
def run_query(sql):
"""Runs a given SQL query via the global database connection.
:param sql: MySQL query
:return: Pandas dataframe containing results
"""
return pd.read_sql_query(sql, connection)
def mysql_disconnect():
"""Closes the MySQL database connection.
"""
connection.close()
def close_ssh_tunnel():
"""Closes the SSH tunnel connection.
"""
tunnel.close
day_of_test = "24.01.22"
gold_close = 1000
sap_close= 1000
bonds_close= 1000
btc_est= 1000
btc_actual= 1000
actual_difference = 1000
open_ssh_tunnel()
mysql_connect()
query = ("INSERT INTO `ML1`(`day_of_test`, `gold_close`, `sap_close`, `bonds_close`, `btc_est`, `btc_actual`,`actual_difference`) VALUES (%s, %s, %s, %s, %s, %s, %s);"%
(day_of_test, gold_close, sap_close, bonds_close, btc_est, btc_actual, actual_difference))
df = run_query(query)
print(df)
df.head()
mysql_disconnect()
close_ssh_tunnel()
您的 df = run_query(...)
行中有错字。
你用了逗号;但你应该使用 %.
即
df = run_query("INSERT INTO `ML1`(`day_of_test`, `gold_close`, `sap_close`, `bonds_close`, `btc_est`, `btc_actual`,`actual_difference`) VALUES (%s, %s, %s, %s, %s, %s, %s);" %
(day_of_test, gold_close, sap_close, bonds_close, btc_est, btc_actual, actual_difference))
我想使用 ssh 隧道访问 Mysql 数据库。 不幸的是,这段代码的架构似乎不支持我的查询格式,因为该函数似乎与我的查询格式不兼容。
/Users/peter/PycharmProjects/MySqlLocalhostTest/venv/lib/python3.10/site-packages/paramiko/transport.py:236: CryptographyDeprecationWarning: Blowfish has been deprecated
"class": algorithms.Blowfish,
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/code.py", line 90, in runcode
exec(code, self.locals)
File "<input>", line 96, in <module>
File "<input>", line 65, in run_query
File "/Users/peter/PycharmProjects/MySqlLocalhostTest/venv/lib/python3.10/site-packages/pandas/io/sql.py", line 399, in read_sql_query
return pandas_sql.read_query(
File "/Users/peter/PycharmProjects/MySqlLocalhostTest/venv/lib/python3.10/site-packages/pandas/io/sql.py", line 2081, in read_query
columns = [col_desc[0] for col_desc in cursor.description]
TypeError: 'NoneType' object is not iterable
像 (Select * From Table) 这样的简单语句可以完美地工作。
我必须在 mysql 语法或函数中更改什么才能使它工作?
抱歉我是个菜鸟。如果有任何建议或帮助,我将不胜感激。
import pandas as pd
import pymysql
import logging
import sshtunnel
from sshtunnel import SSHTunnelForwarder
ssh_host = '172.xxx.xxx.xxx'
ssh_username = 'root'
ssh_password = 'xxxxxxx'
database_username = 'root'
database_password = 'xxxxxxxx'
database_name = 'analysis-db'
localhost = '127.0.0.1'
def open_ssh_tunnel(verbose=False):
"""Open an SSH tunnel and connect using a username and password.
:param verbose: Set to True to show logging
:return tunnel: Global SSH tunnel connection
"""
if verbose:
sshtunnel.DEFAULT_LOGLEVEL = logging.DEBUG
global tunnel
tunnel = SSHTunnelForwarder(
(ssh_host, 22),
ssh_username=ssh_username,
ssh_password=ssh_password,
remote_bind_address=('127.0.0.1', 3306)
)
tunnel.start()
def mysql_connect():
"""Connect to a MySQL server using the SSH tunnel connection
:return connection: Global MySQL database connection
"""
global connection
connection = pymysql.connect(
host='127.0.0.1',
user=database_username,
passwd=database_password,
db=database_name,
port=tunnel.local_bind_port
)
def run_query(sql):
"""Runs a given SQL query via the global database connection.
:param sql: MySQL query
:return: Pandas dataframe containing results
"""
return pd.read_sql_query(sql, connection)
def mysql_disconnect():
"""Closes the MySQL database connection.
"""
connection.close()
def close_ssh_tunnel():
"""Closes the SSH tunnel connection.
"""
tunnel.close
day_of_test = "24.01.22"
gold_close = 1000
sap_close= 1000
bonds_close= 1000
btc_est= 1000
btc_actual= 1000
actual_difference = 1000
open_ssh_tunnel()
mysql_connect()
query = ("INSERT INTO `ML1`(`day_of_test`, `gold_close`, `sap_close`, `bonds_close`, `btc_est`, `btc_actual`,`actual_difference`) VALUES (%s, %s, %s, %s, %s, %s, %s);"%
(day_of_test, gold_close, sap_close, bonds_close, btc_est, btc_actual, actual_difference))
df = run_query(query)
print(df)
df.head()
mysql_disconnect()
close_ssh_tunnel()
您的 df = run_query(...)
行中有错字。
你用了逗号;但你应该使用 %.
即
df = run_query("INSERT INTO `ML1`(`day_of_test`, `gold_close`, `sap_close`, `bonds_close`, `btc_est`, `btc_actual`,`actual_difference`) VALUES (%s, %s, %s, %s, %s, %s, %s);" %
(day_of_test, gold_close, sap_close, bonds_close, btc_est, btc_actual, actual_difference))