我正在使用带有Postgresql后端的PHP PDO.我有一个表有一些可以为空的字段,当用户在HTML表单字段中没有输入任何内容时,我想在该字段中插入NULL,而不是空字符串(这很重要,因为这些表中的一些SELECT稍后会使用条件等as WHERE x IS NOT NULL).
但是,此版本的bindParam代码会将空字符串插入可为空的字段而不是NULL.
$stmt2->bindParam(':title', $title, PDO::PARAM_STR);
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多,并且发现这是将null插入字段的答案:
$stmt2->bindParam(':title', $title, PDO::PARAM_NULL);
Run Code Online (Sandbox Code Playgroud)
但这意味着我需要预先检查所有传递给可空字段的参数,以确定它们是否为空,如果是,则传递PDO :: PARAM_NULL而不是PDO_PARAM_STR.我当然可以这样做,但希望可能有一个设置只会告诉PDO它是否遇到空字符串,而是插入null.
我偶然发现了这个
$this->dbh->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);
Run Code Online (Sandbox Code Playgroud)
但它没有任何效果,经过进一步的研究,我认为这只影响出路的记录,而不是在路上.
除了预先检查变量之外的任何选项?
谢谢亚伦
我正在使用django创建一个博客.它安装在虚拟环境中,并已安装django-tagging.我在做DB迁移以南,一切似乎好的工作与我的迁移,但似乎没有被创建的标签表,所以当我去通过管理来添加一个博客文章中,我得到了著名PostgreSQL的错误:
Exception Type: DatabaseError at /admin/bppsite/blogpost/add/
Exception Value: relation "tagging_tag" does not exist
LINE 1: ...ECT "tagging_tag"."id", "tagging_tag"."name" FROM "tagging_t...
Run Code Online (Sandbox Code Playgroud)
这是我的models.py的相关部分:
from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^tagging\.fields\.TagField"])
from tagging.models import Tag
from tagging.fields import TagField
class BlogPost(models.Model):
title = models.CharField(max_length = 255)
text = models.TextField()
author = models.ForeignKey(User)
created = models.DateTimeField(auto_now_add = True)
modified = models.DateTimeField(auto_now = True)
status = models.CharField(max_length = 10, choices=POST_STATUS_CHOICES, default='DRAFT')
slug = models.SlugField(max_length = 255, blank=True)
category = models.ManyToManyField(Category)
tags = TagField()
def __unicode__(self):
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个PL/PGSQL触发器函数来检查新行的日期范围,以确保表中没有其他日期范围重叠的行(对于相同的product_id).我已经成功创建了该函数并将其设置为BEFORE INSERT触发器,但我正在试图弄清楚如何将其设置为BEFORE UPDATE触发器,因为触发器内的SELECT语句肯定会抛出异常,因为它适合重叠自身更新版本日期的标准.
这是我的功能:
CREATE OR REPLACE FUNCTION check_specials_dates()
RETURNS trigger AS
$$
DECLARE
BEGIN
IF EXISTS (SELECT * FROM rar.product_specials
WHERE product_id = NEW.product_id
AND (
(NEW.end_time between start_time and end_time) OR
(NEW.start_time between start_time and end_time) OR
(start_time between NEW.start_time and NEW.end_time))
THEN
RAISE EXCEPTION
'Cannot insert overlapping specials date for Product ID#%', NEW.product_id;
END IF;
RETURN NEW;
END
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我的想法是IF EXISTS SELECT语句将返回一个匹配项,因为它将在它尝试更新的行上匹配.
它是否正确?如果是这样,我该如何解决它?