我目前正在尝试使用 PyMySQL 库通过 python 程序连接到在 AWS 上创建的 MySql 数据库
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import pymysql
host = 'admin.cjp8hsqu4je0.us-east-2.rds.amazonaws.com'
user = 'admin'
password = '12345678'
database = 'admin'
connection = pymysql.connect(host, user, password, database)
with connection:
cur = connection.cursor()
cur.execute("SELECT VERSION()")
version = cur.fetchone()
print("Database version: {} ".format(version[0]))
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,出现以下错误:
Traceback (most recent call last):
File "C:\Users\SuperPC\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 581, in connect
sock = socket.create_connection(
File "C:\Users\SuperPC\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 808, in create_connection
raise err
File "C:\Users\SuperPC\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 796, in create_connection …Run Code Online (Sandbox Code Playgroud) 这似乎是一项非常简单的任务,但我在做正确的事情时遇到了困难.
我的SQL查询看起来像这样:
self.link = self.db.cursor(pymysql.cursors.DictCursor);
self.link.execute("SELECT * FROM crawler_data WHERE id=%d" % id_crawl)
Run Code Online (Sandbox Code Playgroud)
我想通过以下方式访问列:
row = self.link.fetchall()
if row["address"]:
self.address = self.filterAddress(row["address"])
Run Code Online (Sandbox Code Playgroud)
我收到了错误"list indices must be integers, not str".
当我打印row我得到以下结构返回:
{u'address': 'Address Value', u'domain': 'Domain Value'}
Run Code Online (Sandbox Code Playgroud)
如何访问"地址"字符串?
我正在尝试使用Python处理大量数据并在MySQL中维护处理状态.但是,我很惊讶没有python-mysql的标准连接池(如Java中的HikariCP).
我最初是从PyMySQL开始的,事情很棒,直到程序运行最初几个小时.几个小时后,事情开始失败.我遇到了很多错误:
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 99] Cannot assign requested address)")
Run Code Online (Sandbox Code Playgroud)
此外,很多端口都处于TIME_WAIT状态,因为由于缺少连接池,我太频繁地打开和关闭连接
/d/p/950 ??? netstat -nt | wc -l
84752
Run Code Online (Sandbox Code Playgroud)
每本和这个,我试图设置tcp_fin_timeout和ip_local_port_range,但几乎没有任何改善.
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
Run Code Online (Sandbox Code Playgroud)
然后我发现MySQL提供了带有池功能的mysql.connector .在做完所有这些表现后实际上恶化了.更多流程开始失败.我正在使用Python的多处理模块在24核机器上同时运行29个进程(多处理.Pool默认选择此项).以下是代码,当然我使用.my.cnf传递所有凭据以避免将它们提交给git:
import mysql.connector
from mysql.connector import pooling
conn_pool = pooling.MySQLConnectionPool(pool_name="mypool1",
pool_size=pooling.CNX_POOL_MAXSIZE,
option_files=MYSQL_CONFIG,
option_groups=MYSQL_GROUP_NODE1,
allow_local_infile=True)
conn = conn_pool.get_connection()
Run Code Online (Sandbox Code Playgroud)
最后,还原为旧代码.仍在使用PyMySQL,虽然错误较少,但它仍然是一个重大问题.我查看了SQLAlchemy,并没有真正找到关于池的文档.
我想知道其他人如何处理mysql-python连接池问题?我真的相信应该有一些东西,所以我不必重新发明轮子.
任何指针都非常感谢.
connection-pooling time-wait pymysql mysql-connector-python python-multiprocessing
我正在使用 python 测试与 mysql 服务器的连接。我需要 ssh 进入服务器并建立 mysql 连接。以下代码有效:
from sshtunnel import SSHTunnelForwarder
import pymysql
import mysql.connector
with SSHTunnelForwarder((ssh_host, 22), ssh_username=ssh_user, ssh_password=ssh_password,
remote_bind_address=("127.0.0.1", 3306)) as tunnel:
config = {
'user': user,
'password': password,
'host': tunnel.local_bind_host,
'port': tunnel.local_bind_port,
'database': db
}
conn = pymysql.connect(**config)
query = '''SELECT VERSION();'''
data = pd.read_sql_query(query, conn)
print(data)
connection.close()
Run Code Online (Sandbox Code Playgroud)
但是,当使用mysql.connector而不是pymysql如下所示时:
with SSHTunnelForwarder((ssh_host, 22), ssh_username=ssh_user, ssh_password=ssh_password,
remote_bind_address=("127.0.0.1", 3306)) as tunnel:
config = {
'user': user,
'password': password,
'host': tunnel.local_bind_host,
'port': tunnel.local_bind_port,
'database': db …Run Code Online (Sandbox Code Playgroud) 我有一个Flask应用程序,在Apache中运行,依赖于PyMySQL.该应用程序提供了一系列REST命令.它在Python 3下运行.
在不提供整个来源的情况下,该计划的结构如下:
#!flask/bin/python
import json
import pymysql
from flask import *
# Used to hopefully share the connection if the process isn't restarted
mysql_connection = None
# Gets the mysql_connection, or opens it
GetStoreCnx():
global mysql_connection
if (mysql_connection != None):
store_connection_string = ""
# Get the connection string from the config file
with open('config/storedb.json', 'r') as f:
store_connection_string = json.load(f)
mysql_connection = pymysql.connect(**store_connection_string)
return mysql_connection;
class Server(Flask):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Return results via REST
@app.route('/results1', …Run Code Online (Sandbox Code Playgroud) 我正在尝试从运行在Google App Engine之上的Python应用程序(使用PyMySQL 0.7.9)连接到Cloud SQL.
我的连接字符串看起来像这样(凭证当然是假的):
pymysql.connect(unix_socket='/cloudsql/gae_project_name:cloudsql_instance_name',
user='user', password='', db='database_name')
Run Code Online (Sandbox Code Playgroud)
我收到的错误消息是:
OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 97] Address family not supported by protocol)")
这就像PyMySQL没有意识到我正在尝试通过Unix套接字连接并尝试使用host参数的默认值(我认为是localhost)
我能够使用相同的连接字符串连接MySQLdb.
我有一个用户定义的函数,它使用pymysql连接到mysql数据库,然后它询问数据库并将结果读入Pandas数据帧.
import pandas as pd
import pymysql
import getpass
def myGetData(myQuery):
myServer = 'xxx.xxx.xxx.xxx'
myUser = input("Enter MySQL database username: ")
myPwd = getpass.getpass("Enter password: ")
myConnection = pymysql.connect(host=myServer,user=myUser,password=myPwd)
myTempDF = pd.io.sql.read_sql(myQuery, con=myConnection)
myConnection.close()
return myTempDF
myDF = myGetData("SELECT * FROM `myDB`.`myTable`")
Run Code Online (Sandbox Code Playgroud)
我已经编写了代码来捕获pymysql.connect()引起的异常,尽管为了清楚起见我没有在这里显示它.我还希望能够捕获read_sql()可能产生的任何异常.我在哪里可以找到可能引发的异常列表?它不在Pandas文档中(http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.read_sql.html),我在网上找不到任何提示.我可以捕获所有异常,但这似乎通常被Python社区所厌恶.我应该如何捕获read_sql()引发的异常?
编辑
我已经做了更多的工作,似乎即使我知道正在生成什么错误,也不是直截了当地捕获异常.因此,例如,在上面给出的代码中,如果我错误地输入用户名和/或密码,则会生成操作错误.最后一行或错误报告的内容如下:
OperationalError: (1045, "Access denied for user 'yyy'@'xxx.xxx.xxx.xxx' (using password: YES)")
Run Code Online (Sandbox Code Playgroud)
我已经能够使用以下方法捕获此错误:
try:
phjConnection = pymysql.connect(host=phjServer, user=phjUser, password=phjPwd)
except pymysql.OperationalError as e:
print("\nAn OperationalError occurred. Error number {0}: {1}.".format(e.args[0],e.args[1]))
Run Code Online (Sandbox Code Playgroud)
这工作正常(虽然发现需要使用pymysql.OperationalError捕获的OperationalError是偶然的).
现在,在函数的下一部分中,Pandas函数real_sql()使用上面创建的连接来运行SQL查询.如果我包含一个故意不正确的查询,其表名不正确,则会发生另一个OperationalError,然后是DatabaseError:
OperationalError: (1142, "SELECT …Run Code Online (Sandbox Code Playgroud) 我使用 PyMysql 连接到我的 MySQL 数据库。
cursor.execute(query)
data = cursor.fetchall()
for (id,clientid,timestamp) in cursor:
print id,clientid,timestamp
Run Code Online (Sandbox Code Playgroud)
我想根据时间戳对数据进行排序;喜欢;
sortedList = sorted(data, key=lambda x: x.timestamp, reverse=False)
Run Code Online (Sandbox Code Playgroud)
但游标返回行。如何返回整个数据,以便我可以根据任何参数对它们进行排序?
ps:这里的数据包含多行,例如;
1, '1170', 'AS0001', 1, '1', datetime.datetime(2018, 3, 15, 10, 56), Decimal('15185.7562'), Decimal('0.0000'), Decimal('19814.3181')
我用过很多 python pandas 和 MySQL。但以分开的方式。为了实现更好的自动化任务,我开始了解pymysql。
对我来说,我发现一些数据库操作只能通过 pymysql+pandas 操作来实现。然而,一些数据库操作,我必须使用sqlachemy来创建引擎。这让我很困惑。那里的 sqlalechmy 引擎是什么以及引擎和连接之间的区别/关系
基于官方文档pymysql:这个包包含一个纯Python MySQL客户端库。
据我了解,基本上,它是连接 python 和 mysql 的驱动程序。由于pandas有read_sql方法方法,
所以我应该通过结合这两者来实现所有数据库操作。
例如,基于以下
etl_conn = pymysql.connect(host = host, user = user,password = passwd,db = db_health_plan)
query = 'select * from HEALTH_PLAN.WD_PNL_MONTHLY'
pd.read_sql(query, etl_conn, index_col = 'index')
Run Code Online (Sandbox Code Playgroud)
我可以使用 pandas.io 和 pymysql 创建一个表
from pandas.io import sql
create_table_query ='CREATE TABLE WD_PNL_MONTHLY_05052020 AS SELECT * FROM
HEALTH_PLAN.WD_PNL_MONTHLY';
sql.execute(create_table_query, etl_conn)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将行插入表时失败了。
total.to_sql('WD_PNL_MONTHLY', etl_conn,
schema= 'HEALTH_PLAN', if_exists='append',
index=True, index_label=None, chunksize=None, dtype=None)
Run Code Online (Sandbox Code Playgroud)
为了完成任务,我必须创建引擎链接 sqlalchemy 和 …
我正在尝试使用 Pandas 和 MySQL 将数据(推文和其他 Twitter 文本信息)导入到数据库中。我收到以下错误:
166:警告:(1366,“不正确的字符串值:'\xF0\x9F\x92\x9C\xF0\x9F...' 对于第 3 行的 'text' 列”)结果 = self._query(query)
166:警告:(1366,“不正确的字符串值:'\xF0\x9F\x98\x8D t...' 列 'text' 在第 5 行”)结果 = self._query(query)
经过彻底搜索后,我的数据库列的设置方式似乎有问题。我已经尝试将数据库字符集设置为 UTF8 并将其整理为 utf_unicode_ci,但我仍然收到相同的错误。
以下是将数据导入数据库的代码:
#To create connection and write table into MySQL
engine = create_engine("mysql+pymysql://{user}:{pw}@{lh}/{db}?charset=utf8"
.format(user="user",
pw="pass",
db="blahDB",
lh="bla.com/aald/"))
df.to_sql(con=engine, name='US_tweets', if_exists='replace')
Run Code Online (Sandbox Code Playgroud)
我正在导入的数据由以下数据类型组成:“int64”、“object”和“datetime64[ns]”。我通过将数据打印到控制台来发现这些数据类型
print(df['tweett']) >>> returns dtype 'object'
Run Code Online (Sandbox Code Playgroud)
我很感激任何帮助,谢谢!
pymysql ×10
python ×7
mysql ×6
pandas ×3
python-3.x ×2
amazon-rds ×1
apache ×1
flask ×1
io ×1
sqlalchemy ×1
ssh ×1
time-wait ×1
utf-8 ×1