我正在尝试将python变量插入到python脚本中的MySQL表中,但它无法正常工作.这是我的代码
add_results=("INSERT INTO account_cancel_predictions"
"(account_id,21_day_probability,flagged)"
"Values(%(account_id)s,%(21_day_probability)s,%(flagged)s)")
data_result={
'account_id':result[1,0],
'21_day_probability':result[1,1],
'flagged':result[1,2]
}
cursor.execute(add_results,data_result)
cnx.commit()
cursor.close()
cnx.close()
Run Code Online (Sandbox Code Playgroud)
这会得到错误
ProgrammingError: Failed processing pyformat-parameters; 'MySQLConverter' object has no attribute '_float64_to_mysql'
Run Code Online (Sandbox Code Playgroud)
但是,当我替换变量名称result[1,0]时result[1,1],以及result[1,2]它们的实际数值它确实有效.我怀疑python传递的是实际的变量名而不是它们持有的值.我该如何解决?
我正在尝试使用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
最近将 Django 项目从 2.x 升级到 3.x,我注意到mysql.connector.django后端(来自mysql-connector-python)不再工作。它使用的最后一个 Django 版本是 2.2.11。3.0 就打破了。我在用mysql-connector-python==8.0.19。
运行时manage.py runserver出现如下错误:
django.core.exceptions.ImproperlyConfigured: 'mysql.connector.django' isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
'mysql', 'oracle', 'postgresql', 'sqlite3'
Run Code Online (Sandbox Code Playgroud)
我知道这不是官方的 Django 后端,但由于我无法控制的原因,我必须在这个项目上使用它。
我 80% 确定这是库的问题,但我只是想看看除了等待更新之外是否可以采取任何措施来解决它。
更新:
mysql.connector.django现在可以与 Django 3+ 一起使用。
这是 docker-compose 文件
version: '3.3'
services:
mysql:
image: mysql:latest
restart: always
environment:
MYSQL_DATABASE: 'bot'
MYSQL_USER: 'user'
MYSQL_PASSWORD: '123'
MYSQL_ROOT_PASSWORD: 'root'
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- mybot:/var/lib/mysql
python:
restart: always
build: .
environment:
MYSQL_DATABASE: 'bot'
MYSQL_USER: 'user'
MYSQL_PASSWORD: '123'
MYSQL_ROOT_PASSWORD: 'root'
volumes:
- mybot:/usr/app
command: tail -f /dev/null
volumes:
mybot:
Run Code Online (Sandbox Code Playgroud)
和 Dockerfile
FROM python
user root
WORKDIR /usr/src
COPY requirements.txt ./
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip3 install -r requirements.txt
RUN mkdir -p …Run Code Online (Sandbox Code Playgroud) 我有一个带表的工作数据库,可以查询,插入,更新等.光标也连接到正确的数据库.
桌子:

当从表中查询数据时遇到麻烦:
query = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s'
idProduct = '106'
cursor.execute(query, (idProduct))
Run Code Online (Sandbox Code Playgroud)
在调试时我看一下cursor.execute()函数:params = str: 106将传递给:
stmt = operation % self._process_params(params)
Run Code Online (Sandbox Code Playgroud)
哪里
res = params
# pylint: disable=W0141
res = map(self._connection.converter.to_mysql, res)
Run Code Online (Sandbox Code Playgroud)
被称为res = str: 106.我不确定转换器在做什么但结果res = list: ['1', '0', '6'].并且这些参数将传递给execute函数,该函数将遇到以下错误:
File "C:\Python27\lib\site-packages\mysql\connector\cursor.py", line 480, in execute
"Wrong number of arguments during string formatting")
mysql.connector.errors.ProgrammingError: Wrong number of arguments during string formatting
Run Code Online (Sandbox Code Playgroud)
我有一个肮脏的解决方法,但我不满意.在某些情况下可能不起作用:
query = …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')
我使用python3和pandas连接到一些sql数据库:
import pandas as pd
import mysql.connector
cnx = mysql.connector.connect(user='me', password='***',
host='***',
database='***')
df=pd.read_sql("select id as uid,refType from user where registrationTime>=1451606400",con=cnx)
cnx.close()
Run Code Online (Sandbox Code Playgroud)
我得到2列:id和refType,它们都是string类型(SQL术语中的varchar).但是,由于某种原因,refType列被正确导入为字符串,但是uid列被导入为bytearray.这是他们看起来的样子:
df.head()
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)uid0 [49,54,54,57,55,54,50,55,64,97,110]
1 [49,54,54,57,55,54,50,56,64,105,111]
2 [ 49,48,49,53,51,50,51,50,57,53,57,5 ...
3 [57,53,52,52,56,57,56,56,49,50,57, 5 ...
4 [49,54,54,57,55,54,50,57,64,105,111]Run Code Online (Sandbox Code Playgroud)refType0 adx_Facebook.IE_an_ph_u8 _-.cc-ch.gf.au-ret7.c ...
1 adx_Facebook.IE_io_ph_u4 _-.cc-gb.gf.au-toppay ...
2 ad_nan_1845589538__CAbroadEOScys _-.cc-ca.gf.a. ..
3 ad_offerTrialPay-DKlvl10-1009
4 adx_Facebook.IE_io_ph_u4 _-.cc-us.gf.au-topspe ...
这就是uid列应该看起来的样子:
[i.decode() for i in df['uid'][1:5]]
Run Code Online (Sandbox Code Playgroud)
['16697628 @ io','10153232959751867 @ fb','954489881295911 @ fb','16697629 @ io']
我不明白为什么它转换为bytearray,也不知道如何选择将其转换为字符串.我在互联网或熊猫文档中找不到任何关于它或类似问题的内容.当然,我总是可以在导入后将该列转换为字符串,但这不是首选,因为显示的sql查询只是一个示例,并且在实际表中可能有数百列不正确地导入为bytearrays.在手动找到那些列并转换为字符串的屁股上真的很痛苦
连接器本身输出相同的bytearray:
cursor = cnx.cursor()
cursor.execute('select id …Run Code Online (Sandbox Code Playgroud) 我想使用准备好的语句使用python将数据插入MySQL DB(版本5.7),但是我一直收到NotImplementedError。我在这里关注文档:https : //dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html
使用python-2.7和mysql-connector-python库的8.0.11版本:
pip show mysql-connector-python
---
Metadata-Version: 2.1
Name: mysql-connector-python
Version: 8.0.11
Summary: MySQL driver written in Python
Home-page: http://dev.mysql.com/doc/connector-python/en/index.html
Run Code Online (Sandbox Code Playgroud)
这是我正在运行的python脚本的清理后的版本(没有特定的主机名,用户名,密码,列或表):
import mysql.connector
from mysql.connector.cursor import MySQLCursorPrepared
connection = mysql.connector.connect(user=username, password=password,
host='sql_server_host',
database='dbname')
print('Connected! getting cursor')
cursor = connection.cursor(cursor_class=MySQLCursorPrepared)
select = "SELECT * FROM table_name WHERE column1 = ?"
param = 'param1'
print('Executing statement')
cursor.execute(select, (param,))
rows = cursor.fetchall()
for row in rows:
value = row.column1
print('value: '+ value)
Run Code Online (Sandbox Code Playgroud)
运行此命令时出现此错误:
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) 作为构建过程的一部分,我们使用mysqldiff实用程序(从maven调用)通过将新构建的模式副本与从基线创建的模式版本以及迁移脚本进行比较来验证数据库迁移脚本.这一切都适用于MySQL 5.7.
我们正在寻求升级到MySQL 8.0.13.数据库用户已配置为使用mysql_native_password.当我们运行构建时,我们会收到以下错误mysqldiff:
ERROR: Authentication plugin 'caching_sha2_password' is not supported
Run Code Online (Sandbox Code Playgroud)
我们知道这个错误是由于该实用程序使用旧版本的mysql-python-connector.我们也理解答案可能就像升级连接器版本一样简单,但我们不知道如何尝试.
可以在https://github.com/mysql/mysql-utilities找到MySQL Utilities .
在Windows 10上,我们使用Oracle Windows安装程序进行安装.在Amazon Linux上,我们使用yum进行安装.
注意:
我们如何解决这个错误,以便我们可以在Windows 10和Amazon Linux上使用mysqldiff和MySQL 8.0.13服务器?
如果答案只是升级连接器,那么执行此操作的详细步骤是什么?
我们可以进行服务器安装/配置更改以支持连接旧驱动程序的客户端吗?
我正在使用 Python、Flask、MySQL 和 uWSGI 开发基于 Web 的应用程序。但是,我没有使用 SQL Alchemy 或任何其他 ORM。我正在使用来自旧 PHP 应用程序的预先存在的数据库,该数据库无论如何都不能很好地与 ORM 配合使用,所以我只是mysql-connector手动使用和编写查询。
该应用程序在我第一次启动时运行正常,但是当我第二天早上回来时,我发现它已经坏了。我会收到类似mysql.connector.errors.InterfaceError: 2013: Lost connection to MySQL server during query或类似的错误mysql.connector.errors.OperationalError: 2055: Lost connection to MySQL server at '10.0.0.25:3306', system error: 32 Broken pipe。
我一直在研究它,我想我知道问题是什么。我只是一直无法找到一个好的解决方案。尽我所能,问题在于我保留了对数据库连接的全局引用,并且由于 Flask 应用程序始终在服务器上运行,因此该连接最终会过期并变得无效。
我想为每个查询创建一个新连接就足够简单了,但这似乎远非理想的解决方案。我想我还可以构建某种连接缓存机制,它会在一小时左右后关闭旧连接,然后重新打开它。这是我能想到的最好的选择,但我仍然觉得应该有更好的选择。
我环顾四周,大多数收到这些错误的人都有巨大的或损坏的表,或者类似的东西。这里情况不同。旧的 PHP 应用程序仍然运行良好,表的行数都少于 50,000 行,列数少于 30,Python 应用程序运行良好,直到它停顿了大约一天。
所以,这里希望有人有一个很好的解决方案来保持与 MySQL 数据库的持续打开连接。或者,也许我完全在错误的树上吠叫,如果是的话,希望有人知道。