我想使用codeigniter活动记录实现SQL语句.
UPDATE tags SET usage = usage+1 WHERE tag="java";
Run Code Online (Sandbox Code Playgroud)
如何使用Codeigniter活动记录实现此目的?
问候
核心数据驱动应用程序的常见方案是从后备存储中获取唯一对象.如果存在具有特定唯一属性的对象,则返回该对象,如果它不返回新创建的对象.我发现自己一遍又一遍地写同样的东西,所以我用一种方便的方法把它包起来.但这似乎是微不足道的,我在这里重新发明轮子吗?有没有更简单,开箱即用的方法来实现这一目标?
干杯,
EP
+(id)uniqueEntityfForName:(NSString *)name
withValue:(id)value
forKey:(NSString *)key
inManagedObjectContext:(NSManagedObjectContext *)context {
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
request.entity = [NSEntityDescription entityForName:name inManagedObjectContext:context];
request.predicate = [NSPredicate predicateWithFormat:[key stringByAppendingString:@" == %@"], value];
NSArray *result = [context executeFetchRequest:request error:nil];
id entity = [result lastObject];
if (entity == nil) {
entity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];
[entity setValue:value forKey:key];
} else {
entity = [result lastObject];
}
return entity;
}
Run Code Online (Sandbox Code Playgroud)
我使用这样的方法:
SomeEntity *entity = [CDUtils uniqueEntityfForName:@"SomeEntity" withValue:@"foo" forKey:@"bar" inManagedObjectContext:context];
Run Code Online (Sandbox Code Playgroud) 我需要在数据库中写一行,无论它是否已经存在.在使用NHibernate之前,这是通过存储过程完成的.该过程将尝试更新,如果没有修改行,它将回退到插入.这很好用,因为应用程序不关心记录是否存在.
使用NHibernate,我发现的解决方案需要加载实体并对其进行修改,或删除实体以便插入新实体.如果记录已经存在,应用程序必须关心.有办法吗?
该对象具有关键字作为分配的ID,并且是表中的主键.
据我所知,SaveOrUpdate()将根据Id调用Save()或Update()方法.使用指定的ID,这将不起作用,因为id不是未保存的值.但是,版本或时间戳字段可以用作指示符.实际上,这是不相关的,因为这只反映了内存中的对象是否与数据库中的记录相关联; 它不表示数据库中是否存在记录.
如果分配的id确实是问题的原因,我可以使用生成的id而不是关键字作为主键.这将避免NHibernate插入/更新问题,因为它实际上总是插入.但是,我仍然需要防止重复的关键字.使用关键字列上的唯一索引,即使主键不同,它仍会为重复关键字抛出异常.
也许问题不在于NHibernate,而在于它的建模方式.与应用程序的其他区域不同,这是以数据为中心而非以对象为中心的.NHibernate很容易读/写并消除了存储过程.但是,在不考虑现有值的情况下简单编写的愿望并不适合对象的身份模型的模型.有没有更好的方法来解决这个问题?
我有两个INSERT命令,对我来说没用,因为两组行 - 已经在表中的行和我作为INSERT命令的行 - 不是分离的.两个命令都插入了大量行和大量值.
因此,如果我想执行这些行,我会得到重复的输入错误.
有没有简单的方法将这些命令"转换"成UPDATE?
我知道这听起来很愚蠢,因为为什么我做INSERT的命令,如果我想UPDATE.只是为了使它成为一个明确的场景:另一个开发人员给了我脚本:)
谢谢,丹尼尔
编辑 - 问题解决了
首先,我创建了一个表并用我的INSERT命令填充它,然后我使用以下REPLACE命令:
REPLACE
INTO table_1
SELECT *
FROM table_2;
Run Code Online (Sandbox Code Playgroud)
最初可以在以下位置找到:如何合并两个MySQL表?
它们似乎是被允许的,因为我可以看到我的插入触发器在表格下列出了不同的名称.这是常见的还是坏的做法?我正在使用SQL Server 2005
我从tableONE查询并尝试将结果集插入tableTWO.这有时会导致tableTWO中出现重复键错误.所以我想ON DUPLICATE KEY UPDATE使用tableONE结果集中的新确定值,而不是忽略它ON DUPLICATE KEY UPDATE columnA = columnA.
INSERT INTO `simple_crimecount` (`date` , `city` , `crimecount`)(
SELECT
`date`,
`city`,
count(`crime_id`) AS `determined_crimecount`
FROM `big_log_of_crimes`
GROUP BY `date`, `city`
) ON DUPLICATE KEY UPDATE `crimecount` = `determined_crimecount`;
# instead of [ON DUPLICATE KEY UPDATE `crimecount` = `crimecount`];
Run Code Online (Sandbox Code Playgroud)
它返回一个错误说明如下
Unknown column 'determined_crimecount' in 'field list'
Run Code Online (Sandbox Code Playgroud) 我使用sqlalchemy作为我的orm,并declarative用作Base.
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
Run Code Online (Sandbox Code Playgroud)
我的问题是,我如何知道用户已被修改,以及如何在没有查询数据库的情况下再次获取原始值?
user = Session.query(User).filter_by(id=user_id).first()
# some operations on user
....
# how do I know if the user.name has been changed or not?
...
# How do get the original name?
Run Code Online (Sandbox Code Playgroud)
提前致谢!
UPDATE
我发现一个方法get_history可以得到一个字段的历史值,但我不确定它是否是我的目的的正确方法.
from sqlalchemy.orm.attributes import get_history
user = Session.query(User).first()
print user.name # 'Jack'
print get_history(user, 'name') # ((),['Jack'],())
user.name = 'Mike'
print get_history(user, 'name') # (['Mike'], (),['Jack'])
Run Code Online (Sandbox Code Playgroud)
那么,我们可以检查一下它的价值 …
如果记录不存在,我需要在表中插入记录,如果表中存在记录,则需要更新记录.当然,我可以写:p-code:
SELECT * FROM table1 WHERE id='abc' by JDBC
if(exists)
UPDATE table1 SET ... WHERE id='abc' by JDBC;
else
INSERT INTO table1... by JDBC;
Run Code Online (Sandbox Code Playgroud)
但是,我不认为代码是优雅的.或者,我也可以用这种方式编写它:p代码:
int row = Statement.executeUpdate("INSERT INTO table1...", 2);
if(row==0)
update table1 SET ... WHERE id='abc' by JDBC;
Run Code Online (Sandbox Code Playgroud)
你认为后一种方式更好更快吗?谢谢!
编辑:在MYSQL中
我正在使用大量记录对mongo集合执行更新查询.所以我正在使用skip()和limit()功能.例如:在第一个文件中,我正在处理前50000条记录.
cur1= db.collection_name.find(no_cursor_timeout=True).skip(0).limit(50000)
Run Code Online (Sandbox Code Playgroud)
在发送文件中,我正在访问下一个50000条记录
cur2=db.collection_name.find(no_cursor_timeout=True).skip(50000).limit(50000)
Run Code Online (Sandbox Code Playgroud)
我在单独的文件中对这两个游标执行各种更新查询.现在我想知道如何将这些更新的记录添加回集合中?cur2查询中是否会更新cur2记录?
我有一个 pandas DataFrame,需要将其存储到数据库中。这是我当前用于插入的代码行:
df.to_sql(table,con=engine,if_exists='append',index_label=index_col)
Run Code Online (Sandbox Code Playgroud)
如果我的表中不存在任何行,则此方法可以正常工作df。如果行已存在,我会收到此错误:
sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) duplicate key
value violates unique constraint "mypk"
DETAIL: Key (id)=(42) already exists.
[SQL: 'INSERT INTO mytable (id, owner,...) VALUES (%(id)s, %(owner)s,...']
[parameters:...] (Background on this error at: http://sqlalche.me/e/gkpj)
Run Code Online (Sandbox Code Playgroud)
并且没有插入任何内容。
PostgreSQL 有可选ON CONFLICT子句,可用于UPDATE现有表行。我阅读了整个pandas.DataFrame.to_sql 手册页,但找不到任何在函数ON CONFLICT内使用的方法DataFrame.to_sql()。
我考虑过根据数据库表中已有的内容将我的 DataFrame 一分为二。所以现在我有两个 DataFrameinsert_rows和update_rows,我可以安全地执行
insert_rows.to_sql(table, con=engine, if_exists='append', index_label=index_col)
Run Code Online (Sandbox Code Playgroud)
但是,似乎没有UPDATE相当于 的东西DataFrame.to_sql()。那么如何使用 DataFrame 更新表呢update_rows?
insert-update ×10
mysql ×2
python ×2
activerecord ×1
codeigniter ×1
core-data ×1
database ×1
dataframe ×1
duplicates ×1
java ×1
jdbc ×1
limit ×1
mongodb ×1
nhibernate ×1
objective-c ×1
overwrite ×1
pandas ×1
postgresql ×1
resultset ×1
skip ×1
sql ×1
sql-server ×1
sqlalchemy ×1
triggers ×1
unique ×1
upsert ×1