我正在使用SQLAlchemy Core运行几个独立的语句。这些语句是针对不同的表格且互不相关的。因此,我不能使用标准的table.insert()
方法同时传入多个参数字典。目前,我的做法是:
sql_conn.execute(query1)
sql_conn.execute(query2)
我是否可以在不需要两次来回到数据库的情况下一次运行它们? 我使用的是MySQL 5.7和Python 2.7.11。
我正在使用SQLAlchemy Core运行几个独立的语句。这些语句是针对不同的表格且互不相关的。因此,我不能使用标准的table.insert()
方法同时传入多个参数字典。目前,我的做法是:
sql_conn.execute(query1)
sql_conn.execute(query2)
我是否可以在不需要两次来回到数据库的情况下一次运行它们? 我使用的是MySQL 5.7和Python 2.7.11。
with engine.connect() as sql_conn:
with sql_conn.begin():
sql_conn.execute(query1)
sql_conn.execute(query2)
sql_conn.commit()
,它将更改一次性提交到数据库中。如果你想要显式地提交更改,可以这样做:from sqlalchemy import create_engine
engine = create_engine("postgresql://scott:tiger@localhost/test")
connection = engine.connect()
trans = connection.begin()
connection.execute(text("insert into x (a, b) values (1, 2)"))
trans.commit()
https://docs.sqlalchemy.org/en/14/core/connections.html#basic-usage
这句话的意思是:“虽然这主要是针对创建真实数据库事务的,但对于您的用例,它具有有用的副作用,即在SQLAlchemy中维护一个“虚拟”事务。请参阅此链接以获取更多信息。” 会话(Session)跟踪单个“虚拟”事务的状态,使用称为SessionTransaction的对象。然后,这个对象利用Session对象绑定的底层引擎或引擎,根据需要使用连接(Connection)对象启动真正的连接级别事务。query1;
query2;
CALL
-- one-time declaration (overhead not included):
CREATE PROCEDURE both
BEGIN;
query1;
query2;
END;
-- per invocation (1 round trip)
CALL both();
INSERT INTO t (a,b) VALUES (1,2), (11,22), ...;
DELETEs
,UPDATEs
等,还有其他各种技术可以使用,涉及到单个表。)START TRANSACTION;
query1;
query2;
COMMIT;
同时运行两个查询既不明智也不实际。我指的是在单个服务器调用中连续使用两个SQL语句:“SELECT…;SELECT…;”
这样做会为黑客提供另一种通过“SQL注入”进行恶意操作的途径,因此并不明智。
另一方面,虽然可能,但并不一定实用。您可以创建一个包含任意数量相关或不相关查询的存储过程,然后CALL
该过程。有些事情可能会使它不切实际:
如果您和MySQL服务器在同一台机器上,则来回延迟时间不重要,即使两个服务器位于同一数据中心,也通常可以忽略延迟。当客户端和服务器相隔很远时,延迟变得很重要。对于跨大西洋延迟,我们说的是超过100毫秒。从巴西到中国约为250毫秒。(庆幸我们没有生活在木星上。)
"; DROP ...
作为本应只是字符串的一部分。 - Rick James