我正在使用MySQL和PyMySQL进行Python应用程序,我希望能够在得到MySQL错误时知道它的数量,以便我可以根据它做一些不同的事情.
有没有办法用try-except语句或其他方式来做到这一点?
我一直在使用PyMySQL一段时间,并创建了我自己的包装器,我习惯于简写编写查询.尽管如此,我一直在使用OrderedDict创建CSV文件,因为我需要保持顺序相同但我意识到如果我使用PyMySQL来查询数据库,我将无法得到数据库回馈的顺序.如果我只想转储东西而不是手写订单,这对于检查CSV文件有点烦人.
我的问题是,如何将PyMySQL与OrderedDict一起使用?目前我的代码如下:
import pymysql
conn = pymysql.connect(host='localhost', user='root', passwd='', db='test')
cursor = conn.cursor(pymysql.cursors.DictCursor)
Run Code Online (Sandbox Code Playgroud)
所以每当我查询时,我都会收到一本字典:
cursor.execute("""SELECT * FROM test""")
for row in cursor:
pp(row) # gives me dictionary
Run Code Online (Sandbox Code Playgroud)
我想要的是,当我浏览游标时,我实际上是按照它们从数据库中进入的顺序检索列的OrderedDict.
就像是:
cursor = conn.cursor(pymysql.cursors.OrderedDict)
Run Code Online (Sandbox Code Playgroud) 我正在使用pymysql.cursors和一个简化的代码示例,从表中加载一行并每秒打印它是:
#!/usr/bin/env python3
import pymysql.cursors
import time
conn = pymysql.connect(host='localhost',
# credentials etc.
cursorclass=pymysql.cursors.DictCursor)
while True:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM state limit 1;")
vals = cursor.fetchone()
print (vals)
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
state是MariaDb数据库中具有单行的表.
现在,当这个运行时,如果我启动一个MySQL客户端并更改表的内容,这个脚本可以快速地输出原始值; 即它显然没有咨询数据库(!).
我对Python很新,我绝对是PyMySQL的新手,所以如果这是一个愚蠢的问题,那么我会有一些问题,但我有点RTM,它看起来很奇怪.
如何从视图中的函数py文件向我的django数据库插入数据?是python manage.py shell唯一的插入方式吗?
有关我正在使用的更多解释:
例如:
models.py:
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
city = models.CharField(max_length=60)
Run Code Online (Sandbox Code Playgroud)
views.py:
from django.http import HttpResponse
import pymysql
from books.models import Publisher
def send(request):
p = Publisher(name='Apress', city='Berkeley')
p.save()
Run Code Online (Sandbox Code Playgroud)
urls.py
来自niloofar.views import send
url(r'^ index /',发送),
我想在加载页面索引时,send函数工作并将数据插入数据库.
这是行不通的.它没有给出任何错误,当我刷新索引页面时没有任何反应,没有任何内容被发送到数据库.我认为在我尝试插入数据的方式上存在语法错误.
让我注意到即使我跑的python manage.py shell话:
来自books.models import Publisher
p =出版商(name ='Apress',city ='Berkeley')
p.save()
什么都不会插入django数据库.
我在短时间内从使用许多不同线程的 python 代码(使用 pymysql)对 mysql 表进行了大量插入。
每个线程,其中有很多,最终可能会或可能不会将数据推送到 MySql 表。
这是导致问题的代码块(可以为每个正在运行的线程调用):
sql = ("INSERT INTO LOCATIONS (location_id, place_name) VALUES (%s, %s)")
cursor = self.connection.cursor()
cursor.execute(sql, (location_id, place_name))
cursor.close()
Run Code Online (Sandbox Code Playgroud)
特别是这一行:
cursor.execute(sql, (location_id, place_name))
Run Code Online (Sandbox Code Playgroud)
这会导致此错误:
pymysql.err.InterfaceError: (0, '')
Run Code Online (Sandbox Code Playgroud)
另请注意,我在上述块所在的类的 init 中定义了 self.connection。因此所有线程共享一个 self.connection 对象,但获得自己的游标对象。
该错误似乎是随机发生的,并且仅在对 mysql 表进行了多次插入后才开始出现(我认为)。它不一致意味着每次尝试插入 mysql 时都不会发生这种情况。
我在谷歌上搜索了这个特定的错误,似乎它可能是由于在运行查询之前关闭了游标。但我相信很明显我在执行查询后关闭了游标。
现在我认为这是因为:
想法?
我现在正在学习 SQLAlchemy,但遇到了一个令我困惑的错误。是的,这里已经有类似的问题了,但似乎没有一个得到解决。
我的目标是使用ORM模式来查询数据库。所以我创建了一个模型:
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import Session, registry
from sqlalchemy.sql import select
database_url = "mysql+pymysql://..."
mapper_registry = registry()
Base = mapper_registry.generate_base()
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True)
name = Column(String(32))
engine = create_engine(database_url, echo=True)
mapper_registry.metadata.create_all(engine)
Run Code Online (Sandbox Code Playgroud)
新我想加载表中所有条目的整行:
with Session(engine) as session:
for row in session.execute(select(User)):
print(row.name)
#- Error: #
Traceback (most recent call last):
...
print(row.name)
AttributeError: Could not locate column in row for column 'name'
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?我不应该能够访问 ORM 模型的字段吗?或者我误解了 ORM 的想法? …
如何在Python3中将输入转义为MySQL数据库?我正在使用PyMySQL并且工作正常,但是当我尝试做类似的事情时:
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = '{}'".format(request[1]))
Run Code Online (Sandbox Code Playgroud)
如果字符串有'或不起作用".我也尝试过:
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s",request[1])
Run Code Online (Sandbox Code Playgroud)
这个问题是库(PyMySQL)使用Python2.x的格式化语法%,它不再起作用了.我也发现了这种可能的解决方案
conn.escape_string()
Run Code Online (Sandbox Code Playgroud)
在这里,但我不知道在哪里添加此代码.这就是我得到的:
import pymysql
import sys
conn = pymysql.connect( host = "localhost",
user = "test",
passwd = "",
db = "test")
cursor = conn.cursor()
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(request[1]))
result = cursor.fetchall()
cursor.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)
编辑:我解决了!在PyMySQL中,正确的方法是这样的:
import pymysql
import sys
conn = pymysql.connect(host="localhost",
user="test",
passwd="",
db="test")
cursor = conn.cursor()
text = …Run Code Online (Sandbox Code Playgroud) 我们遇到了与mysql服务器超时连接的间歇性问题.我们收到的错误如下.
(2003, 'Can\'t connect to MySQL server on \'<connection>\' ((2013, "Lost connection to MySQL server during query (error(104, \'Connection reset by peer\'))"))')
Callstack:
File "/usr/lib64/python2.7/site-packages/pymysql/connections.py", line 818, in _connect
2003, "Can't connect to MySQL server on %r (%s)" % (self.host, e))
File "/usr/lib64/python2.7/site-packages/pymysql/connections.py", line 626, in __init__
self._connect()
更多信息:
错误本身看起来是从ec2上关闭的tcp连接生成的.我们的TCP保持活动时间设置为7200秒,并且当错误被触发时.
我的问题是如何找出这些打嗝发生的原因?很棒的是,它们并不经常发生,但它们发生的并不理想.
任何建议将不胜感激!
更新10/29:
我一直在运行一个服务检查,看看我是否在sql服务器上运行了任何长进程,看起来这些错误没有达到那么远.永远不会为此连接创建新进程!我仍然收到了打嗝,没有任何关联的迹象.
我在Python中使用pymysql连接到数据库.它工作正常,但现在我得到了以下error:
Traceback(最近一次调用最后一次):
File "/Users/njethani/Desktop/venv/lib/python3.6/site-packages/pymysql/__init__.py", line 94, in Connect
return Connection(*args, **kwargs)
File "/Users/njethani/Desktop/venv/lib/python3.6/site-packages/pymysql/connections.py", line 327, in __init__
self.connect()
File "/Users/njethani/Desktop/venv/lib/python3.6/site-packages/pymysql/connections.py", line 598, in connect
self._request_authentication()
File "/Users/njethani/Desktop/venv/lib/python3.6/site-packages/pymysql/connections.py", line 865, in _request_authentication
data = _auth.scramble_old_password(self.password, self.salt) + b'\0'
File "/Users/njethani/Desktop/venv/lib/python3.6/site-packages/pymysql/_auth.py", line 72, in scramble_old_password
hash_pass = _hash_password_323(password)
File "/Users/njethani/Desktop/venv/lib/python3.6/site-packages/pymysql/_auth.py", line 97, in _hash_password_323
for c in [byte2int(x) for x in password if x not in (' ', '\t', 32, 9)]:
File "/Users/njethani/Desktop/venv/lib/python3.6/site-packages/pymysql/_auth.py", line 97, in <listcomp>
for c in …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试使用 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) pymysql ×10
mysql ×6
python ×6
python-3.x ×3
amazon-rds ×2
django ×2
django-views ×1
mariadb ×1
orm ×1
python-2.7 ×1
sql ×1
sqlalchemy ×1