所以我有一个python脚本,它通过大约350,000个数据对象,并且根据一些测试,它需要更新一行代表MySQl数据库中每个对象.我也使用pymysql,因为我遇到的问题最少,特别是在发送大型选择查询时(select语句where column IN (....)包含可能包含100,000+以上的值).
由于每行的每次更新可能不同,因此每个更新语句都不同.例如,对于一行,我们可能想要更新,first_name但对于另一行,我们希望first_name保持不变,我们想要更新last_name.
这就是为什么我不想使用cursor.executemany()接受一个通用更新语句的方法,然后你给它提供值,但是正如我所提到的,每次更新都是不同的,所以有一个通用的更新语句对我的情况不起作用.我也不想通过网络单独发送超过350,000个更新语句.无论如何,我可以将所有更新语句打包在一起并立即发送它们吗?
我尝试在一个查询中使用它们并使用该cursor.execute()方法但它似乎并不更新所有行.
我不确定这是否可行,但我正在寻找一种在连接丢失时重新连接到mysql数据库的方法.所有连接都保存在gevent队列中,但我认为这无关紧要.我敢肯定,如果我花一些时间,我可以想出一种方法来重新连接到数据库.但是我看了一下pymysql代码,我看到Connection类中有一个'ping'方法,我不确定如何使用它.
该方法看起来会在第一次重新连接,但之后又将重新连接标志再次切换为False?我可以使用这种方法,还是有不同的方法来建立连接丢失?即使不是pymysql,人们如何处理,数据库服务器崩溃并且不得不重新建立与mysql服务器的连接?
def ping(self, reconnect=True):
''' Check if the server is alive '''
if self.socket is None:
if reconnect:
self._connect()
reconnect = False
else:
raise Error("Already closed")
try:
self._execute_command(COM_PING, "")
return self._read_ok_packet()
except Exception:
if reconnect:
self._connect()
return self.ping(False)
else:
raise
Run Code Online (Sandbox Code Playgroud) 我使用的是aiohttp和sqlalchemy,和我创建了一个单身,帮助我,当我需要的SQLAlchemy(代码如下)的实例连接.不幸的是,每隔一段时间我就会收到以下错误(我通过重启服务器"解决"):
12月11日09:35:29 ip-xxx-xxx-xxx-xxx gunicorn [16513]:sqlalchemy.exc.StatementError:(sqlalchemy.exc.InvalidRequestError)在无效事务回滚之前无法重新连接[SQL:'.. .\nFROM ... \nWHERE ... =%(username_1)s \n LIMIT%(param_1)s'] [参数:[{}]]```
有没有办法修复当前的代码?谢谢 :)
CONNECTION_DETAILS = {
'driver': 'pymysql',
'dialect': 'mysql',
'host': os.environ.get('HOST'),
'port': 3306,
'user': 'master',
'password': os.environ.get('PASSWORD'),
'database': 'ourdb',
'charset': 'utf8'
}
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
con_str = '{dialect}+{driver}://{user}:{password}@' \
'{host}:{port}/{database}?charset={charset}'\
.format(**cls.CONNECTION_DETAILS)
try:
engine = sqlalchemy.create_engine(con_str)
Session = scoped_session(sessionmaker(bind=engine))
session = Session() # Create the ORM handle
except sqlalchemy.exc.OperationalError:
logger.exception('Establishing database connection error.')
cls._instance = super().__new__(cls)
logger.debug("Returning …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 SSL 和 PyMySQL 连接我的数据库,但我找不到关于语法是什么的好的文档。
这些凭据可在 Workbench 和 CLI 中使用,但在使用 PyMySQL 时出现此错误。
无法连接到“server.domain.com”上的 MySQL 服务器([WinError 10061] 无法建立连接,因为目标机器主动拒绝了它)”)
db_conn = pymysql.connect(
host=db_creds['host'],
user=db_creds['user'],
passwd=db_creds['passwd'],
db=db_creds['db'],
charset=db_creds['charset'],
ssl={'ssl':{'ca': 'C:/SSL_CERTS/ca-cert.pem',
'key' : 'C:/SSL_CERTS/client-key.pem',
'cert' : 'C:/SSL_CERTS/client-cert.pem'
}
}
)
Run Code Online (Sandbox Code Playgroud)
如果我关闭 SSL 并删除 SSL 参数,我可以连接不安全就好了。我的 SSL 参数有什么问题?
编辑:PyMySQL 现在想要像这样列出 ssl 参数而不是在字典中。
db_conn = pymysql.connect(
host=db_creds['host'],
user=db_creds['user'],
passwd=db_creds['passwd'],
db=db_creds['db'],
charset=db_creds['charset'],
ssl_ca='C:/SSL_CERTS/ca-cert.pem',
ssl_key='C:/SSL_CERTS/client-key.pem',
ssl_cert='C:/SSL_CERTS/client-cert.pem'
)
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用PyMysql,到目前为止我所做的一切(选择/插入),但是当我尝试更新它只是不起作用,没有错误没有什么,只是没有做任何事情.
import pymysql
connection = pymysql.connect(...)
cursor = connection.cursor()
cursor.execute("UPDATE Users SET IsConnected='1' WHERE Username='test'")
cursor.close()
connection.close()
Run Code Online (Sandbox Code Playgroud)
是的我已经仔细检查过Users,IsConnected和Username都是正确的并且测试确实存在(SELECT适用于它)
这是我的问题?
执行以下操作时:
import pymysql
db = pymysql.connect(host='localhost', port=3306, user='root')
cur = db.cursor()
print(cur.execute("SELECT ParentGuardianID FROM ParentGuardianInformation WHERE UserID ='" + UserID + "'"))
Run Code Online (Sandbox Code Playgroud)
输出是1
我怎么能改变代码,以便打印ParentGuardianID(即'001')的实际值而不是1.
我确信答案很简单,但我是初学者,所以任何帮助都会非常感激 - 谢谢!
我试图插入一个title可以是NULL字符串的PyMySQL 字段().但它不起作用.
query = """
INSERT INTO `chapter` (title, chapter, volume)
VALUES ("%s", "%s", %d)
"""
cur.execute(query % (None, "001", 1))
cur.execute(query % ("Title", "001", 1))
Run Code Online (Sandbox Code Playgroud)
此代码插入None数据库.如果我删除第一个周围的双引号%s,它会抛出一个错误:
pymysql.err.InternalError: (1054, "Unknown column 'None' in 'field list'")
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能插入NULL?
我正在使用 SQLModel 库做一个简单的事情,select()就像他们的官方网站上描述的那样。但是我收到Column expression or FROM clause expected错误消息
from typing import Optional
from sqlmodel import Field, Session, SQLModel, create_engine, select
from models import Hero
sqrl = f"mysql+pymysql:///roo@asdf:localhost:3306/datab"
engine = create_engine(sqrl, echo=True)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
def select_heroes():
with Session(engine) as session:
statement = select(Hero)
results = session.exec(statement)
for hero in results:
print(hero)
def main():
select_heroes()
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
这是我的models/Hero.py代码:
from datetime import datetime, date, time
from typing import Optional
from sqlmodel import Field, …Run Code Online (Sandbox Code Playgroud) 我使用Anaconda发行版的Python 3.4.在这个发行版中,我发现该pymysql库连接到现有的MySQL数据库,该数据库位于另一台计算机上.
import pymysql
config = {
'user': 'my_user',
'passwd': 'my_passwd',
'host': 'my_host',
'port': my_port
}
try:
cnx = pymysql.connect(**config)
except pymysql.err.OperationalError :
sys.exit("Invalid Input: Wrong username/database or password")
Run Code Online (Sandbox Code Playgroud)
我现在想为我的应用程序编写测试代码,我希望在setUp每个测试用例中创建一个非常小的数据库,最好是在内存中.但是,当我尝试使用pymysql它时,它无法建立连接.
def setUp(self):
config = {
'user': 'test_user',
'passwd': 'test_passwd',
'host': 'localhost'
}
cnx = pymysql.connect(**config)
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 61] Connection refused)")
Run Code Online (Sandbox Code Playgroud)
我一直在谷歌搜索,并发现了一些关于SQLite和MySQLdb.我有以下问题:
sqlite3或MySQLdb适合在内存中快速创建数据库?MySQLdb在Anaconda包中安装?setUp?这甚至是个好主意吗? …如何从视图中的函数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数据库.
pymysql ×10
python ×9
mysql ×6
python-3.x ×2
sqlalchemy ×2
aiohttp ×1
django ×1
django-views ×1
mysql-python ×1
sql ×1
sql-update ×1
sqlite ×1
sqlmodel ×1
ssl ×1