我想写一个仓储程序。
谁能指导我使用数据库层框架。
我以前使用过实体框架,但我不喜欢它,因为它会引发很多未知错误。
有没有人建议使用 nhibernate 或任何其他框架,或者您认为如果我使用直接查询或存储过程,它会更可靠更好吗?
就性能而言,以下哪一项是 PHP 的最佳 ORM?我也想在 Codeigniter 框架中使用它。我现在正在尝试 php-activerecord,它的表现还不错。我查看了 Doctrine2、DataMapper 之类的东西,但是在我构建一个大项目之前我无法谈论任何关于性能的信息(那时,改变主意为时已晚)。
有什么想法吗?
我有两个实体类Activity和User. 它们之间的关系是:
Activity可以有一个或多个UserUser可以属于一个或多个Activity所以为了实现这一点,我定义@ManyToMany了它们之间的映射。下面是我的课:
Activity:
@javax.persistence.Entity
@Table(name = "ACTIVITY")
public class Activity extends Entity {
@Transient
private static final long serialVersionUID = 4741665931936809028L;
private Set<User> users;
public Activity() {
super();
}
@ManyToMany(targetEntity = User.class, cascade = { CascadeType.ALL })
@JoinTable(name = "ACTIVITY_USER", joinColumns = @JoinColumn(name = "ID"), inverseJoinColumns = @JoinColumn(name = "ID"))
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取最新预订的课程(唯一)。我已经尝试使用 Doctrine 查询构建器进行以下操作:
$repository = $this->getDoctrine()->getRepository('AppBundle:Booking');
$query = $repository->createQueryBuilder('b')
->select('(b.course) AS course')
->orderBy('b.id', 'DESC')
->groupBy('b.course')
->setMaxResults(5)
->getQuery();
Run Code Online (Sandbox Code Playgroud)
没有 orderby 它可以工作,但它将遍历预订升序。我需要最新预订的课程。通过此查询,我收到此错误:
SQLSTATE[42000]:语法错误或访问冲突:1055 ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列......它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 500 Internal Server Error - DriverException 不兼容
我还尝试了以下方法:
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT DISTINCT c.id
FROM AppBundle:Booking b
JOIN b.course c
ORDER BY b.id DESC'
);
Run Code Online (Sandbox Code Playgroud)
SQLSTATE[HY000]:一般错误:3065 ORDER BY 子句的表达式 #1 不在 SELECT 列表中,引用列...不在 SELECT 列表中;这与 DISTINCT 不兼容
现在我已经搜索了解决方案,基本上找到了很多禁用ONLY_FULL_GROUP_BY的建议。禁用 ONLY_FULL_GROUP_BY
一些评论指出,为了遵守 sql 标准而这样做是不明智的。那么这怎么可能以一种有效的方式实现呢?
我有一个代码,应该在并发请求和重负载下工作。
我写了一个例子来更好地理解我正在尝试做的事情:
def add_tag():
with transaction.atomic():
image = Image.objects.get(pk=2)
tag = Tag.objects.get(pk=6)
image.tags.add(tag) # concurrent insert
return 'done'
class Command(BaseCommand):
def handle(self, *args, **options):
with ProcessPoolExecutor(max_workers=3) as executor:
futures = []
for _ in range(3):
futures.append(executor.submit(add_tag))
for future in as_completed(futures):
print(future.result())
Run Code Online (Sandbox Code Playgroud)
这是我的模型:
class Image(models.Model):
title = models.CharField(max_length=255)
tags = models.ManyToManyField('ov_tags.Tag')
class Tag(models.Model):
title = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)
我正在尝试并行插入 ManyToMany 关系表。显然,由于 READ COMMITED 隔离级别的原因,这会导致错误:
django.db.utils.IntegrityError: duplicate key value violates unique constraint
Run Code Online (Sandbox Code Playgroud)
绝对没问题,但是如何彻底消除这个错误呢?
为了保护我的图像,我尝试在图像选择上使用 select_for_update 。
image = Image.objects.select_for_update().get(pk=2)
Run Code Online (Sandbox Code Playgroud)
而且...它有效!我运行了好几次。不再有错误并且项目插入正确。但我不知道为什么?
select_for_update 是否锁定关系表?或者它发生在应用程序端?有没有正确的方法来实现这种行为?
我可以使用空选择来锁定插入吗?
SELECT …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用get_or_create方法来查看记录是否存在。如果记录存在,则什么都不做,否则创建它。
这个模型基本上用在失败的命令上
class modelStudentExamsPerformed(models.Model):
patient = models.ForeignKey(modelPatient)
student = models.ForeignKey(modelStudent,on_delete=models.CASCADE)
normalBodyPart = models.ForeignKey(modelNormalBodyPartResult,default=None,blank=True,null=True)
abnormalBodyPart = models.ForeignKey(modelAbnormalBodyPartResult,default=None,blank=True,null=True)
tool = models.CharField(max_length=128, default="")
Run Code Online (Sandbox Code Playgroud)
现在这是使用上述模型但失败的命令
exams.modelStudentExamsPerformed.objects.get_or_create()(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0],normalBodyPart=None,date=None)
Run Code Online (Sandbox Code Playgroud)
上面的语句给了我错误:
get() returned more than one modelStudentExamsPerformed -- it returned 2!
Run Code Online (Sandbox Code Playgroud)
现在这是我遇到麻烦的地方。当我通过我的管理员查看数据库时,我确实注意到两个对象,但这些对象都有一个关联的值normalBodyPart并且它们abnormalBodyPart是空的。既然我明确指定并分配了一个值,abnormalBodyPart为什么 django 说两个项目已经存在?我希望这是有道理的 。
让我们以另一种方式解释这一点,假设有两个语句 1 和 2。语句 1 根据指定的参数获取或创建记录。这个 get 或 create 失败,因为 django 认为已经有两条记录。但是语句 2 使用相同的确切参数并返回 0 条记录。这是为什么 ?我在这里缺少什么和不理解?
声明 1:
exams.modelStudentExamsPerformed.objects.get_or_create()(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0],normalBodyPart=None,date=None)
Run Code Online (Sandbox Code Playgroud)
当显然该表中的所有对象都没有 的值时abnormalBodyPart。我通过执行以下操作验证了这一点
声明 2:
k = exams.modelStudentExamsPerformed.objects.filter(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0], normalBodyPart=None,date=None)
Run Code Online (Sandbox Code Playgroud)
上面的语句 2 …
CREATE TABLE band (
length DECIMAL(6, 3) PRIMARY KEY NOT NULL,
resolution DECIMAL(4, 1) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我在postgreSQL数据库中定义了此表,并且正在为我的应用程序使用JPA。我应该在对应的对象属性中使用哪种数据类型Length?我尝试使用,double但出现以下错误:
由以下原因引起:org.hibernate.tool.schema.spi.SchemaManagementException:模式验证:表[band]的列[length]中遇到的列类型错误;找到了[数字(Types#NUMERIC)],但是期望是[float8(Types#DOUBLE)]
我正在使用 NuGet 包AsyncPoco v1.2,官方PetaPoco的异步分支——“适合你的 POCO 的一个小 ORM东西”。选择的 DBRM 是 Oracle,但这无关紧要。
到目前为止,经典的 PetaPoco 包一直在工作,但我的问题是 AsyncPoco 包没有使用Column属性的值,而是完全忽略它并简单地使用属性名称作为直接列标识符。
例子:
我创建了 Poco
[PrimaryKey("ID_COL", SequenceName = "SCHEMA.SCHEMA_TABLE_SEQ")]
[TableName("SCHEMA.SCHEMA_TABLE")]
public class PocoModel
{
[Column("ID_COL")]
public long Id { get; set; }
[Column("NAME_COL")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我为所需的属性赋值,然后尝试执行 InsertAsync
public async Task InsertPoco(PocoModel model, DbConnection conn)
{
var taskCompletionSource = new TaskCompletionSource<bool>();
using (var database = new AsyncPoco.Database(conn))
{
await database.InsertAsync(model);
taskCompletionSource.TrySetResult(true);
}
await taskCompletionSource.Task;
}
Run Code Online (Sandbox Code Playgroud)
但是,我在尝试 …
我已经看过并使用了几个后端框架,如django,RoR,Spring Boot.所有这些都带有内置的ORM.
但NodeJS很受欢迎,因为缺乏内置的ORM.缺乏内置ORM背后的原因是什么?
语境:
我维护遗留的 Django 代码。在许多情况下,我的代码接收多个模型对象,每个模型对象都有一个ForeignKey或代表相同数据实体的手动缓存属性。因此所涉及的数据实体不会改变。但是,并非我收到的所有对象都曾经访问过这些foreignkey字段或缓存的属性,因此数据可能不会出现在这些对象上,尽管它会在第一次访问时延迟加载。
我不容易访问/控制声明模型的代码。
我想找到我拥有的任何一个具有已准备好的缓存的对象,这样我就可以避免访问数据库来检索我想要的数据(如果没有,我会在必要时这样做)。这是因为该数据的获取过于频繁,导致性能问题。
Django 1.6,Python 2.7。
问题
我可以询问我们手动缓存的字段,并且internal_is_cached(instance, 'fieldname')无需运行查询。但是,我无法对ForeignKey字段执行此操作。
假设我在 Django 中有一个模型类,Foo如下所示:
class Foo(models.Model):
bar = models.ForeignKey('BarModel')
Run Code Online (Sandbox Code Playgroud)
问题
Foo如果我从某处获取模型的实例,但我不知道是否bar曾经调用过它,或者是否已急切地获取它,我如何确定读取instance.bar是否会查询数据库?
换句话说,我想从外部确定任意模型是否具有针对给定的内部缓存ForeignKey,而关于该模型的状态或来源的其他知识为零。
我尝试过的
我尝试使用 Django 缓存进行模型缓存来解决该问题。相关数据的获取过于频繁,以至于对我们的缓存系统造成了不可持续的负载。
我从这个问题尝试了各种解决方案。它们适用于修改后的模型,但似乎不适用于尚未突变的模型——我对模型的“延迟加载”状态感兴趣,而不是“待修改”状态。其中许多解决方案也不适用,因为它们需要更改模型继承或行为,我希望尽可能避免这种情况(政治)。
这个问题看起来很有希望,但它需要控制模型的初始读者过程。我的代码接收到的模型对象可以来自任何地方。
_default_manager模型对象的内部方法,众所周知,这对于我们在生产中的一些(高度定制的)模型对象来说是不准确的字段引用。其中一些非常奇怪,如果可能的话,我更愿意坚持使用记录的(或者至少是稳定的并且不经常被绕过的)API。orm ×10
django ×4
c# ×2
postgresql ×2
python ×2
sql ×2
async-await ×1
caching ×1
codeigniter ×1
database ×1
django-orm ×1
doctrine-orm ×1
foreign-keys ×1
hibernate ×1
jpa ×1
many-to-many ×1
micro-orm ×1
mysql ×1
node.js ×1
performance ×1
php ×1
spring-boot ×1
symfony ×1