我正在使用带有ActiveRecord和PostgreSQL的Ruby on Rails.
如何执行多个SQL查询?
我需要它来运行自定义迁移脚本,例如:
Foo.connection.execute <<-SQL.split(';').map(&:strip).join
delete from metadata where record_type = 'Foo';
TRUNCATE table1 RESTART IDENTITY;
TRUNCATE table2 RESTART IDENTITY;
delete from schema_migrations where version > '20120806120823';
SQL
Run Code Online (Sandbox Code Playgroud)
我不接受用户的数据,所以我不担心sql注入.
CLIENT_MULTI_STATEMENTS也许像MySQL 这样的东西?
来自MySQL/PHP文档:
CLIENT_MULTI_STATEMENTS:告诉服务器客户端可以在一个字符串中发送多个语句(以";"分隔).如果未设置此标志,则禁用多语句执行.有关此标志的更多信息,请参阅此表后面的注释.
这是我的PostgreSQL函数:
salvarArquivoGeometricoCasoZeroPOINT
(dimensao text,tableName text,tuplas text[],srid text)
Run Code Online (Sandbox Code Playgroud)
它有一个text[]参数,我想String[]从我的JPQL 传递一个Java :
public String salvarGeometriaCaso0(String[] tuplas,FileDto arquivo){
Query query =
em().createNativeQuery("select
salvarArquivoGeometricoCasoZeroPOINT(?1,?2,?3,?4)");
query.setParameter(1,arquivo.getGeo());//String
query.setParameter(2,arquivo.getTable());/String
query.setParameter(3,tuplas);//String[]
query.setParameter(4,arquivo.getSrid());//String
return (String) query.getSingleResult();//function returns a Text, so cast to String
}
Run Code Online (Sandbox Code Playgroud)
上面的代码失败,但有异常:
ERROR] Internal Exception: org.postgresql.util.PSQLException: Can not infer a SQL
type to use for an instance of [Ljava.lang.String;.
Use setObject () with an explicit Types value to specify the type to use.
Run Code Online (Sandbox Code Playgroud)
所以我不确定如何从EclipseLink调用我的函数.
我正在尝试在Windows下安装psycopg2(Windows 7,64位).我使用的是Python(x,y)和PostgreSQL 9.2.1中的Python 2.7.2 .
我的第一次尝试是使用可从http://www.stickpeople.com/projects/python/win-psycopg/下载的Windows端口(psycopg2-2.4.5.win-amd64-py2.7-pg9.1.3-release .可执行程序).然后我收到一条消息
Python 2.7 required but was not found in the registry
Run Code Online (Sandbox Code Playgroud)
在下一个对话框中,它不允许我选择任何python安装.所有其他程序和安装都很愉快地找到了我的python.
这是失败的,我尝试直接从http://pypi.python.org/pypi/psycopg2使用源包但尝试后:
python setup.py install
Run Code Online (Sandbox Code Playgroud)
我现在卡在错误信息中:
error: Unable to find vcvarsall.bat
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何解决这个问题?
是否可以像SELECT在Excel中的VBA 一样进行查询,这样我就可以从Excel查询PostgreSQL数据库了?
如果可能,请解释我如何连接到数据库.我在谷歌看,但没有找到结果.
我是postgres的新手,如何在where子句的MESSAGE参数中转义RTF语法?
select count(*)
from communicationoutgoingmessagescheduledetails
where email='chris.green@waynesreaves.com'
and message='{\rtf1\deff0{\fonttbl{\f0 Times New Roman;}}{\colortbl\red0\green0\blue0 ;\red0\green0\blue255 ;}{\*\listoverridetable}{\stylesheet {\ql\cf0 Normal;}{\*\cs1\cf0 Default Paragraph Font;}{\*\cs2\sbasedon1\cf0 Line Number;}{\*\cs3\ul\cf1 Hyperlink;}}\splytwnine\sectd\pard\plain\ql{\cf0 first }{\b\cf0 paymen}{\b\cf0 t bold }{\cf0 rem}{\cf0 inder}\par\pard\plain\ql{\ul\cf0 se}{\ul\cf0 cond PAYMENT }{\b\ul\cf0 reminder}\b\ul\par}'
and succeddful=-1
and senttime::timestamp::date='2/7/2013 12:00:00 AM'
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误
WARNING: nonstandard use of escape in a string literal LINE 4: and message='{\rtf1\deff0{\fonttbl{\f0 Times New Roman;}}{\c...
HINT: Use the escape string syntax for escapes, e.g., E'\r\n'.
ERROR: invalid Unicode escape LINE 4: and message='{\rtf1\deff0{\fonttbl{\f0 Times …Run Code Online (Sandbox Code Playgroud) 为什么PostgreSQL查询在第一次新连接后的第一次请求中比在后续请求中慢?
使用几种不同的技术连接到postgresql数据库.第一次请求可能需要1.5秒.完全相同的查询将第二次花费.03秒.打开我的应用程序的第二个实例(连接到同一个数据库),第一个请求需要1.5秒,第二个请求需要.03秒.
由于我们使用的技术不同,它们在不同的点连接并使用不同的连接方法,所以我真的不认为它与我编写的任何代码有任何关系.
我认为在第一个请求之前打开连接不会执行"所有操作",因此请求会产生一些开销.
因为我已经使用了数据库,并且保留了服务器所有内容都在内存中所以索引等应该不是问题.
编辑说明 - 告诉我有关查询的信息,老实说查询看起来很不错(索引等).我真的认为postgresql在新连接的第一个查询上有某种开销.
我不知道如何证明/反驳这一点.如果我使用PG Admin III(pgAdmin版本1.12.3),所有查询看起来都很快.我第一次查询的任何其他工具都很慢.大部分时间它的速度并没有明显变慢,如果是这样的话,我总是将其用指数更新ram.但这显然不是那样的.如果我打开我的工具并执行任何其他返回结果的查询,则无论如何第二个查询都很快.如果第一个查询没有返回结果,那么第二个查询仍然很慢,那么第三个查询很快.
编辑2 即使我不认为查询与延迟有任何关系(每个第一个查询都很慢),这里有两个运行Explain(EXPLAIN ANALYZE)的结果
EXPLAIN ANALYZE
select * from company
where company_id = 39
Run Code Online (Sandbox Code Playgroud)
输出:
"Seq Scan on company (cost=0.00..1.26 rows=1 width=54) (actual time=0.037..0.039 rows=1 loops=1)"
" Filter: (company_id = 39)"
"Total runtime: 0.085 ms"
Run Code Online (Sandbox Code Playgroud)
和:
EXPLAIN ANALYZE
select * from group_devices
where device_name ilike 'html5_demo'
and group_id in ( select group_id from manager_groups
where company_id in (select company_id from company where company_name ='TRUTHPT'))
Run Code Online (Sandbox Code Playgroud)
输出:
"Nested Loop Semi Join …Run Code Online (Sandbox Code Playgroud) 有什么方法可以通过 JDBCDEFAULT显式发送占位符,例如 in INSERT INTO sometables VALUES (blah, DEFAULT)?(我几乎可以肯定答案是“否”,但我正在寻找 JDBC 专家的确认)。
假设你有一个PreparedStatement赞:
INSERT INTO mytable(a, b) VALUES (?, ?)
Run Code Online (Sandbox Code Playgroud)
对于表:
CREATE TABLE mytable (
a integer,
b integer default some_function()
);
Run Code Online (Sandbox Code Playgroud)
并且您想在批处理中的某些执行中使用数据库集DEFAULT,mytable.b而不是其他。
在常规 SQL 中,你会写:
INSERT INTO mytable(a, b) VALUES (1, 42)
INSERT INTO mytable(a, b) VALUES (2, DEFAULT);
...
Run Code Online (Sandbox Code Playgroud)
或者当然:
INSERT INTO mytable(a, b) VALUES (1, 42)
INSERT INTO mytable(a) VALUES (2);
Run Code Online (Sandbox Code Playgroud)
...但您不能通过 JDBC 执行此操作。setString("DEFAULT")当然不会发送DEFAULT关键字,只会发送字符串文字'DEFAULT' …
在使用psql时,我想更改初始数据库连接.
我有一个名为"test"的数据库作为初始连接.
psql从命令行运行时,我的提示就是test=#
删除"test"数据库并psql在命令行中运行后,出现以下错误:
psql: FATAL: database "test" does not exist
Run Code Online (Sandbox Code Playgroud)
我理解这意味着什么,但我如何将"postgres"数据库设置为默认值?
而不是psql postgres每次键入.
我需要一个PostgreSQL表的主键.ID应该包含大约20个数字的数字.
我是数据库的初学者,也没有使用PostgreSQL.我找到了一些随机id的例子,但是那些带有字符的例子我只需要一个整数.
任何人都可以帮我解决这个问题吗?
我想在查询条件时写入嵌套大小写,以便存储将来自一个案例的条件和条件变为同一个新列时的另一个案例.为了得到这种结果,我将查询编写为:
(case when sq_name_new1 like format('%%%s%%',demo.name) THEN count(sq_name_new1) else (when demo.empcode is not null then count(demo.id) End) END) AS indivisual from res_scheduledjobs
Run Code Online (Sandbox Code Playgroud)
在上面的查询demo.name列来自CTE.so我的整个查询看起来像:
with demo(empcode,id,name) as
(select hr_employee.emp_code,hr_employee.id,concat(resource_resource.name,' ',hr_employee.middle_name,' ',hr_employee.last_name) as name from hr_employee inner join resource_resource on resource_resource.id=hr_employee.resource_id)
select demo.empcode,demo.name,sq_name_new1,(case when sq_name_new1 like format('%%%s%%',demo.name) THEN count(sq_name_new1) else (when demo.empcode is not null then count(demo.id) End) END) AS indivisual from res_scheduledjobs LEFT JOIN demo on demo.id=res_scheduledjobs.assigned_technician group by res_scheduledjobs.assigned_technician,sq_name_new1,demo.empcode,demo.name ;
Run Code Online (Sandbox Code Playgroud)
我只想将(sq_name_new1)列的计数存储到INDIVISUAL列中,将(demo.id)列的计数存储到同一列中,即如果第一种情况不匹配,则在INDIVISUAL中.但是,当我执行我的查询时,它会抛出一个错误.也就是说,条件语法时出现错误.
请帮我写出正确的嵌套case-when条件.
postgresql ×9
java ×2
sql ×2
activerecord ×1
ado ×1
case-when ×1
command-line ×1
eclipselink ×1
excel ×1
if-statement ×1
jdbc ×1
jpql ×1
nested ×1
odbc ×1
primary-key ×1
psql ×1
python-2.7 ×1
random ×1
ruby ×1
shell ×1
vba ×1
windows ×1