所有,
我正在读一个csv文件并使用sqlalchemy将数据添加到MySQL数据库.其中一个表是地址表,它只能保存唯一的地址.这些地址与另一个具有地址id的外键字段的"语句"表之间存在关系.
因此,对于我的数据文件中的每一行,我创建一个新的语句obj,然后获取相关地址的id.如果地址已存在,则返回该id.否则,我创建一个新的地址obj并返回该id.这是使用下面的代码完成的,改编自这个SO问题.
def get_or_create(self, model, rec):
instance = self.session.query(model).filter_by(**dict(filter(lambda (x,y): x in model.__dict__.keys(), rec.iteritems()))).first()
if instance:
return instance
else:
instance = model(rec)
return instance
Run Code Online (Sandbox Code Playgroud)
我正在使用GUID作为我的id字段,它是地址表的主键的一部分:
class address(Base):
__tablename__ = 'address'
id = id_column()
name = Column(String(75), primary_key=True)
Address_Line_One = Column(String(50), primary_key=True)
Address_Line_Two = Column(String(50), primary_key=True)
Address_Line_Three = Column(String(50), primary_key=True)
Address_Line_Four = Column(String(50), primary_key=True)
Run Code Online (Sandbox Code Playgroud)
将id_column()来自这里,虽然它已被转换为CHAR(32)由于限制别处.最后,这里有一个片段:
currStatement = statements(rec, id=currGUID)
currStatement.address = self.get_or_create(address, rec)
Run Code Online (Sandbox Code Playgroud)
这一切都很好,除非它很慢.对于在一个事务中插入的~65,000个语句,我看到干净测试DB上的1.5小时插入时间.实时观察插入显示它快速达到~10,000行,然后插入速度开始下降.
我该怎么做才能加快插入时间?
编辑:
经过进一步测试,我发现插入时间慢是因为每个对象都是单独插入的.所以,我有~65,000行,每行都有几个sqlalchemy对象,单独插入.使用sqlalchemy 0.7,我如何批量插入对象?
我正在使用 CakePHP 3 和 MySQL。
我想通过模型实现INSERT on DUPLICATE KEY UPDATE又名upsert查询CakePHP 3。
鉴于下表:
+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 1 | admin | 33 |
| 2 | Timmy | 17 |
| 3 | Sally | 23 |
+----+----------+-----+
Run Code Online (Sandbox Code Playgroud)
其中id是主键,username是唯一索引
当我有以下值等待更新时:
Felicia, 27
Timmy, 71
Run Code Online (Sandbox Code Playgroud)
我希望在 upsert后得到以下结果:
+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 1 | admin | 33 |
| …Run Code Online (Sandbox Code Playgroud) 我有一个名为 tableFrom 的表想要插入到名为 tableTo 的表中。插入效果很好,但是如果我再次插入相同的值,则会出现重复键错误。所以我只想更新已经存在的行。我知道命令 ON DUPLICATE with MySQL,不幸的是在 SQL Server 中丢失了。
如果我只想检查一个精确的行,这很容易:
IF EXISTS PK = @PK
Run Code Online (Sandbox Code Playgroud)
但是我正在尝试为整张桌子这样做,我不知道是否可能。我想用游标检查每一行,我是 SQL 的新手。
这是我想出的:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
IF EXISTS (
SELECT
1
FROM
tableFrom F,
tableTo T
WHERE
T.product = F._product
)
BEGIN
UPDATE
tableTo
SET
T.something = F.something
FROM
tableTo T
INNER JOIN
tableFrom F
ON
T.product = F._product
END
ELSE
BEGIN
INSERT INTO tableTo
(product,
something)
SELECT
F._product,
F.something
FROM
tableFrom F
END
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
UPDATE …
我在 MySQL 服务器(版本 5.5.27,安装了 EasyPHP 用于开发)中有一个表,它有一个带有 Auto_Increment 的 ID,它的数据类型是 INT(11)。
当我尝试使用此语句插入记录时,它可以工作。
insert into factclientes (IDFactClientes, IDTercero, SubTotal, IVA, Total)
values ('', '3', '2500.00', '400.00', '2900.00')
ON DUPLICATE KEY UPDATE IDTercero = values(IDTercero),
SubTotal = values(SubTotal),
IVA = values(IVA),
Total = values(Total)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在我的生产服务器(版本 5.6.17,独立安装在另一台机器上)上插入相同的记录时,它会引发错误:
Incorrect integer value: '' for column 'IDFactClientes' at row 1
Run Code Online (Sandbox Code Playgroud)
我知道这是因为主键 ID 'IDFactClientes' 有一个空值。我这样做是因为我对 INSERT 和 UPDATE 使用了相同的语句。如果我的程序不知道并且没有指定 IDFactClientes,我想要一个新记录,如果我的程序已经知道 ID,并且指定了我想要更新记录。
奇怪的是它可以在我的开发机器上运行,但不能在我的生产服务器上运行。
是不是缺少什么设置??我怎么能解决这个问题??我的数据库的所有表都有完全相同的问题,我不想修改程序中的所有语句......如果可能的话
先感谢您!!
我对MySQL的INSERT ... ON DUPLICATE KEY UPDATE语句的返回值感到困惑.当我在MySQL客户端(mysql终端,phpmyadmin或MySQL Workbench)上尝试它时,执行结果具有以下之一:
这些结果很有意义.但是,当我在Java中执行相同的查询(使用mysql-connector 5.1.34)时,JDBC的executeUpdate方法在插入和不更改的情况下返回1,在成功更新的情况下返回2.更新无效时,它不返回0.
这是MySQL JDBC驱动程序的错误吗?如果是这样,是否有一个没有这个bug的版本?如果这不是错误,我如何获得MySQL客户端返回的相同结果?
我不知道如何在 Firebird 中编写 SQL 语句,因此它应该添加新行,并且如果某些条件满足则更新其他列。
例子:
(在MySql中看起来像这样:)
insert into
table (col1, col2, col3) values ('a', 'b', 'c')
on duplicate key update col4=col3;
Run Code Online (Sandbox Code Playgroud) MongoDB中的方法UpdateOne()和方法有什么区别?findOneAndUpdate()我似乎无法理解他们的差异。如果可以使用使用UpdateOne()and 的演示示例,将不胜感激。findOneAndUpdate
我有一个测试表,有一个行条目和2个索引,第一个是主键,然后是a和b列的唯一索引:
CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`c` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `a` (`a`,`b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
--
-- Dumping data for table `test`
--
INSERT INTO `test` (`id`, `a`, `b`, `c`) VALUES
(1, 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
现在我想尝试做以下事情
INSERT INTO test
(a, b, c)
VALUES (1, 2, 100)
ON DUPLICATE KEY UPDATE c = c
Run Code Online (Sandbox Code Playgroud)
我希望将列c的值更新为3到100.但这并没有发生,我没有错误.我究竟做错了什么?
我有2张桌子.一个来自昨天(300k行),另一个来自今天,具有相同的行数,但数据在某些列中发生了变化.
这两个表有大约120列.
我如何只更新更改.
我尝试过使用删除:
delete from tableA
where id in (select id from tableB)
Run Code Online (Sandbox Code Playgroud)
但它太慢了.
也试过了
update tableA inner join tableB
on tableA.id=TableB.id
Run Code Online (Sandbox Code Playgroud)
它没有奏效.
有货币汇率的数组,并且在inputTextField中输入了金额之后,我想更新此货币上的该数组中的所有项目,并将该货币放在tableView中,尝试使用循环来执行此操作,但这不能正常工作,因为这是解决方案刚刚放在表中的每个循环
inputTextField是文本字段的名称
receivedRates:[Double] = [1.1,1.6,2.0,1.3] // just example of the rates
for i in receivedRates {
let newValue = Double(i)*Double(Int(inputTextField.text!)!)
currentAmount.append(newValue)
receivedRates = currentAmount
}
Run Code Online (Sandbox Code Playgroud)
如何不循环地更新此数组,或者可能对此循环有其他解决方案?
insert-update ×10
mysql ×6
sql ×2
arrays ×1
bulkinsert ×1
cakephp ×1
cakephp-3.0 ×1
firebird ×1
firebird2.5 ×1
ios ×1
items ×1
java ×1
jdbc ×1
mongodb ×1
sql-server ×1
sqlalchemy ×1
string ×1
swift ×1
upsert ×1