标签: pymysql

如何使用Python连接AWS RDS MySql数据库

我目前正在尝试使用 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)

mysql amazon-web-services amazon-rds python-3.x pymysql

9
推荐指数
2
解决办法
4万
查看次数

使用pymysql获取数据(DictCursor)

这似乎是一项非常简单的任务,但我在做正确的事情时遇到了困难.

我的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 pymysql

8
推荐指数
1
解决办法
2万
查看次数

python中的MySQL连接池?

我正在尝试使用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

8
推荐指数
1
解决办法
4114
查看次数

通过 SSH 连接到远程 mysql 时,Python mysql-connector 无限期挂起

我正在使用 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)

python mysql ssh pymysql

8
推荐指数
1
解决办法
2821
查看次数

Flask/Apache中的PyMySQL有时返回空结果

我有一个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)

python mysql apache flask pymysql

7
推荐指数
1
解决办法
625
查看次数

无法使用PyMySQL连接到Cloud SQL

我正在尝试从运行在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.

python google-cloud-sql pymysql google-app-engine-python

7
推荐指数
1
解决办法
1485
查看次数

可以从Pandas read_sql()返回什么异常

我有一个用户定义的函数,它使用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)

python mysql python-3.x pandas pymysql

7
推荐指数
2
解决办法
4685
查看次数

如何在Python中从cursor.execute()读取所有数据?

我使用 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 pymysql mysql-connector-python

7
推荐指数
1
解决办法
2万
查看次数

pymysql和sqlalchemy之间的关系

我用过很多 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 和 …

mysql io sqlalchemy pandas pymysql

7
推荐指数
0
解决办法
4015
查看次数

PyMySQL 警告:(1366,“不正确的字符串值:'\\xF0\\x9F\\x98\\x8D t...')

我正在尝试使用 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)

我很感激任何帮助,谢谢!

python mysql utf-8 pandas pymysql

6
推荐指数
1
解决办法
8735
查看次数