我有一个Python脚本,可以在我的开发PC上完美运行.两者都是具有相同Python版本(2.7.9)的Windows 7.但是在目标机器上我得到了一个
ValueError:无法提前格式化日期
错误似乎来自pywin32模块.
该代码使用pywin32调用的第三方库:
raw = win32com.client.Dispatch("MyLib.MyClass")
Run Code Online (Sandbox Code Playgroud)
然后在以后失败:
acq_time = raw.GetCreationDate()
Run Code Online (Sandbox Code Playgroud)
现在我迷失了为什么这在我的电脑上而不是在目标机器上工作.两者都具有Windows 7的"公司安装",例如,相同的区域和日期时间设置.
有什么问题?我该如何解决?
编辑:
看评论.原因可能是使用了哪个C++运行时.我还在调查.我现在怀疑在pywin32的安装时间存在哪些运行时很重要.为什么?因为我的开发PC上的DependenyWalker说MSVCR90.DLL我的Lotus Notes安装依赖于pywin .这告诉我它肯定不是"硬"链接.
2015年6月30日更新:
我错了......这个问题现在也发生在我的电脑上.
一些进一步的信息 该脚本读取数据文件并将读取的元数据插入数据库.只有较旧的文件似乎受到了bug的影响,而不是新的(我现在认为这是假设是错误的).因此我的想法是在我的Dev PC上初始加载,然后希望新文件再也不会出现问题.
如果PC是脚本将运行,它读取的文件是在Windows共享驱动器(映射的网络驱动器)上.我没有访问该驱动器所以我只是将文件复制到我的电脑中.现在,为了进行初始加载,我请求访问所述网络驱动器和BOOM.它也不适用于我的Dev.从共享驱动器读取时的机器.
同一文件并不总是会出现此问题.我现在认为它与特定文件无关.我也尝试在64位PC上使用64位python.在那里花了更长时间才发生错误.事实上,一个文件被成功读取,但在我的电脑上失败了.我现在认为这是某种记忆问题?我相信它总是在日期行上失败,因为所有其他行只返回null或空字符串,这不会导致任何问题,并且完全有可能这样的值可以为null.但是对于日期来说这是一个问题,它不应该为null,然后抛出错误.
编辑更新:
在我的电脑上,它总是在同一个文件上失败.单独加载该文件非常合适.我现在认为这是一种计数器/数字溢出,在读取n个文件之后,会出现问题.它与我每次运行脚本而不是文件本身加载的文件数量有关.单独加载时失败的文件.
问题基本上与下面的问题相同:
JPA级联持久化并且对分离实体的引用会抛出PersistentObjectException.为什么?
我正在创建一个引用现有的独立实体的新实体.现在,当我在Spring数据存储库中保存此实体时,会抛出异常:
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
Run Code Online (Sandbox Code Playgroud)
如果我们看一下spring数据JPA的源代码中的save()方法,我们看到:
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们看看isNew()in AbstractEntityInformation
public boolean isNew(T entity) {
return getId(entity) == null;
}
Run Code Online (Sandbox Code Playgroud)
所以基本上如果我保存()一个新实体(id == null),spring数据将始终调用persist,因此这种情况总是会失败.
在向集合添加新项目时,这似乎是一个非常典型的用例.
我该如何解决这个问题?
编辑1:
注意:
此问题与如何保存引用Spring JPA中现有实体的新实体没有直接关系?.详细说明假设您获得了通过http创建新实体的请求.然后,您从请求中提取信息,并创建您的实体和现有的实体.因此,他们将永远脱离.
我有一个用Spring-Data制作的数据访问层.我现在正在创建一个Web应用程序.这个控制器方法应返回格式为JSON 的Spring-Data页面.
这样的页面是一个列表,其中包含额外的分页信息,例如记录总数等等.
这是可能的,如果是的话怎么样?
与此直接相关,我可以定义属性名称的映射吗?例如.意思是我需要定义如何在JSON中命名分页信息属性(与页面不同).这可能吗?怎么样?
在我的项目中,我在进行单元测试时遇到了麻烦.一个问题是,只进行集成测试要快得多,并且还要测试组件实际上是否一起工作.单元测试新颖的"算法"左右似乎要容易得多.单元测试服务类它只是感觉错误和无用.
我正在使用mockito来模拟spring数据存储库(因此也就是DB访问).问题是如果我告诉模拟的存储库在方法调用getById上返回实体A,它显然会返回它,服务也将返回它.是的,该服务会做一些额外的东西,但是非常小的东西,比如加载延迟集合(来自hibernate).显然我在单元测试中没有任何惰性集合(代理).
例:
@Test
public void testGetById() {
System.out.println("getById");
TestCompound expResult = new TestCompound(id, "Test Compound", "9999-99-9", null, null, null);
TestCompoundRepository mockedRepository = mock(TestCompoundRepository.class);
when(mockedRepository.findOne(id)).thenReturn(expResult);
ReflectionTestUtils.setField(testCompoundService, "testCompoundRepository",
mockedRepository, TestCompoundRepository.class);
TestCompound result = testCompoundService.getById(id);
assertEquals(expResult, result);
}
Run Code Online (Sandbox Code Playgroud)
万岁,其余的都成功了.多么惊喜!不是真的没有.
有人可以向我解释我做错了什么吗?或者这样一个测试的重点是什么?我的意思是我告诉返回expResult然后它返回.哇.多么惊喜!感觉就像我在测试mockito是否有效,而不是我的服务.
编辑:
我看到的唯一好处是,如果有些是愚蠢的错误,就像在那里留下一个不需要的行,将返回值设置为null或类似的愚蠢.这种情况将由单元测试捕获."奖励 - 努力"比例看起来还不错吗?
我正在尝试使用注释和spring-security为我的开源项目添加方法级安全性.我现在面临的问题是找到所有方法,特别是用于分页的方法(例如,返回页面).
使用@PostFilter可以在列表中使用(但我个人认为在应用程序而不是数据库中进行过滤不是一个好主意)但是在分页查询中完全失败.
这是有问题的,因为我有一个Entity包含List<Compound>.复合有不同的实现,用户可能只有权读取其中一个化合物.Compound使用TABLE_PER_CLASS继承.存储库实现QueryDslPredicateExecutor.
我的想法是为每个查询添加一个谓词,根据当前用户限制返回结果.然而,我有点迷失在a)用户和角色的数据模型应该如何看,以及b)如何创建谓词(一旦定义了模型,这可能很容易).或者querydsl是否已经提供基于类型的过滤(在查询类中包含的元素)?
public <S extends T> List<S> save(Iterable<S> entities) {
//...
}
Run Code Online (Sandbox Code Playgroud)
如果我使用以下方法来覆盖
@Override
public List<MyType> save(Iterable<MyType> structures) {
List<MyType> result = new ArrayList<>();
//...
return result;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
method does not override or implement a method from a supertype
name clash: save(Iterable<MyType>) in MyTypeRepositoryImpl and <S>save(Iterable<S>) in SimpleJpaRepository have the same erasure, yet neither overrides the other
where S,T are type-variables:
S extends T declared in method <S>save(Iterable<S>)
T extends Object declared in class SimpleJpaRepository
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?我不需要该方法是通用的,事实上它不应该是.我的意思是
@Override
public <S extends MyType> …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我需要大量提高插入性能.示例:具有大约21K记录的文件需要超过100分钟才能插入.有理由可能需要一些时间,比如20分钟左右,但超过100分钟就太长了.
数据被插入3个表(多对多).Id是从序列生成的,但我已经用Google搜索并设置hibernate.id.new_generator_mappings = true并将allocationSize + sequence增量设置为1000.
此外,数据量根本不是特别的,文件是90 MB.
我已经用visual vm验证了大部分时间花在jdbc驱动程序(postgresql)和hibernate上.我认为该问题与子表中的唯一约束有关.服务层在插入之前进行手动检查(= SELECT).如果记录已存在,则重用它而不是等待约束异常.
因此,对于特定文件的总结,每个表将有1个插入(可能不同但不适用于此文件,这是理想(最快)的情况).这意味着总共60k插入+ 20k选择.仍然超过100分钟似乎很长(是的硬件计数,它是在一个简单的PC驱动器7200转,没有ssd或raid).然而,这是对先前应用程序(普通jdbc)的改进版本,在该应用程序上,此硬件上的相同插入大约需要15分钟.考虑到在两种情况下花费大约4-5分钟用于"预处理",增加是巨大的.
有什么提示可以改进吗?有没有批量加载功能?
我有我的主脚本用argparse解释cli命令,然后通过从另一个模块(由我自己制作)调用相应的东西来启动应用程序.
我现在的问题是如何将处理程序从该模块附加到记录器.使用检索记录器
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
因此我在主脚本中加入了以下内容:
consoleHandler = logging.StreamHandler()
logger = logging.getLogger('MyModule')
logger.addHandler(consoleHandler)
Run Code Online (Sandbox Code Playgroud)
但是'MyModule'有0个日志输出.日志级别是正确的,例如应该有输出.
在MyModule我有以下几点:
logging.getLogger(__name__).addHandler(logging.NullHandler())
Run Code Online (Sandbox Code Playgroud)
但是删除它没有任何区别.
那么我怎样才能正确地将处理程序附加到记录器MyModule?
spring-data ×6
java ×5
python ×2
querydsl ×2
bulkinsert ×1
datetime ×1
generics ×1
json ×1
logging ×1
merge ×1
overriding ×1
persist ×1
pywin32 ×1
spring ×1
spring-mvc ×1
type-erasure ×1
unit-testing ×1