标签: python-db-api

如何为时间戳(日期时间)指定数组的psycopg2参数

我想使用psycopg2在Python中运行PostgreSQL查询,psycopg2按类型列进行过滤timestamp without timezone.我有一个很长的时间戳允许值列表(而不是一个范围)和psycopg2方便地处理数组,所以我认为这应该工作:

SELECT somestuff
FROM mytable
WHERE thetimestamp = ANY (%(times)s)
Run Code Online (Sandbox Code Playgroud)

times参数是一个列表datetime对象.我也试过了psycopg2.Timestamp().它们都转换为WHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...])不幸,但失败并出现以下错误:

operator does not exist: timestamp without time zone = text
LINE 3: WHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...]
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

我也在pgAdmin中证实了这一点,所以它不仅仅是psycopg2.似乎正在发生的事情是Postgres不会隐式地将字符串数组转换为时间戳数组.它会很好地转换单个字符串,如果我明确地添加::timestamp到pgAdmin中的每个元素,数组工作正常,但我不知道如何在psycopg2中这样做.

除了忘记DB-API参数并且只是手动构建长串时间戳之外,最好的方法是什么?有什么方法可以让它投射到正确的类型?

python postgresql timestamp psycopg2 python-db-api

9
推荐指数
1
解决办法
3325
查看次数

为什么Python的DB-API中的连接没有"开始"操作?

使用mysql-python中的游标我曾经称之为"BEGIN;","COMMIT;"和"ROLLBACK;" 明确如下:

try:
    cursor.execute("BEGIN;")
    # some statements
    cursor.execute("COMMIT;")
except:
    cursor.execute("ROLLBACK;")
Run Code Online (Sandbox Code Playgroud)

然后,我发现底层连接对象有相应的方法:

try:
    cursor.connection.begin()
    # some statements
    cursor.connection.commit()
except:
    cursor.connection.rollback()
Run Code Online (Sandbox Code Playgroud)

检查DB-API PEP我发现它没有提到连接对象的begin()方法,即使对于扩展也是如此.

顺便说一下,当您使用该方法时,Mysql-python会抛出DeprecationWarning.例如,sqlite3.connection根本就没有这个方法.

问题是为什么PEP中没有这样的方法?该语句是否可选,是否足以调用commit()?

python sql python-db-api

8
推荐指数
2
解决办法
4242
查看次数

使用python3将numpy整数类型插入sqlite

将numpy整数对象的值插入到python 3中的数据库的正确方法是什么?在python 2.7中,numpy数值数据类型干净地插入到sqlite中,但它们不在python 3中

import numpy as np
import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE foo (id INTEGER NOT NULL, primary key (id))")
conn.execute("insert into foo values(?)", (np.int64(100),)) # <-- Fails in 3
Run Code Online (Sandbox Code Playgroud)

np.float类型在2和3中似乎仍然可以正常工作.

    conn.execute("insert into foo values(?)", (np.float64(101),))
Run Code Online (Sandbox Code Playgroud)

在python 2中,numpy标量整数数据类型不再是int的实例,甚至将整数值浮点数转换为整数.

   isinstance(np.int64(1), int)  # <- true for 2, false for python 3
Run Code Online (Sandbox Code Playgroud)

这就是dbapi无法与numpy无缝协作的原因吗?

python sqlite numpy python-3.x python-db-api

8
推荐指数
2
解决办法
1415
查看次数

为什么Twisted的adbapi无法从单元测试中恢复数据?

概观

上下文

我正在为一些依赖于写入SQLite3数据库的高阶逻辑编写单元测试.为此,我正在使用twisted.trial.unittesttwisted.enterprise.adbapi.ConnectionPool.

问题陈述

我能够创建一个持久的sqlite3数据库并在其中存储数据.使用sqlitebrowser,我能够验证数据是否按预期保持不变.

问题是调用t.e.a.ConnectionPool.run*(例如:) runQuery返回一组空结果,但仅在从a内调用时才返回TestCase.

备注和重要细节

我遇到的问题只发生在Twisted的trial框架内.我第一次尝试调试是将数据库代码从单元测试中拉出来并将其放入一个独立的测试/调试脚本中.所述脚本按预期工作,而单元测试代码则没有(参见下面的示例).

案例1:行为不当单位测试

init.sql

这是用于初始化数据库的脚本.这个文件没有(明显的)错误.

CREATE TABLE ajxp_changes ( seq INTEGER PRIMARY KEY AUTOINCREMENT, node_id NUMERIC, type TEXT, source TEXT, target TEXT, deleted_md5 TEXT );
CREATE TABLE ajxp_index ( node_id INTEGER PRIMARY KEY AUTOINCREMENT, node_path TEXT, bytesize NUMERIC, md5 TEXT, mtime NUMERIC, stat_result BLOB);
CREATE TABLE ajxp_last_buffer ( id INTEGER PRIMARY KEY AUTOINCREMENT, type …
Run Code Online (Sandbox Code Playgroud)

python sqlite unit-testing twisted python-db-api

8
推荐指数
1
解决办法
322
查看次数

跟进:从python执行.sql文件

一年多以前,有人问过这个问题:执行.sql文件,用于在python中的SQL Management Studio中运行.

我正在python中编写一个连接到SQL服务器的脚本,并根据大(几GB).sql文件中的SQL命令创建和填充数据库.

看起来SQLCMD需要下载并安装SQL Server Express.有没有其他方法从python执行.sql文件,而不需要使用我的脚本的每个人下载和安装SQL Server?pyodbc有这种能力吗?

编辑:

这是另一个类似的问题: 使用python MySQLdb执行*.sql文件

在这里,解决方案是从命令(在本例中为mysql.exe)调用实用程序,并将该文件作为参数列出.

在我看来应该有一种方法来使用Python的DB API库之一,但我还没有找到它所以我正在寻找像我可以用来运行文件的SQLCMD或MYSQL这样的*.exe从命令行.

PS如果我没有正确地看这个,请随时纠正我.也许下面的代码与从命令行运行一样有效:

for line in open('query.sql','r'):
    cursor.execute(line)
Run Code Online (Sandbox Code Playgroud)

python sql sql-server pyodbc python-db-api

7
推荐指数
1
解决办法
2万
查看次数

来自pyodbc的sql print语句

如何从中获取输出sql_query

import pyodbc

sql_query = "print 'Hello World'"

conn = pyodbc.connect("DRIVER={SQL Server};
SERVER=myserver;
DATABASE=mydatabase;
UID=myusername;
PWD=mypassword")

cur = conn.cursor()

cur.execute(sql_query)
cur.commit()

for row in cursor.fetchall():
    print row
Run Code Online (Sandbox Code Playgroud)

到目前为止,我认为一个SQL打印是带外的从通常的结构化的反应?

http://www.easysoft.com/developer/languages/perl/sql_server_unix_tutorial.html#print_statement_status_messages有类似于我在Perl中尝试做的事情.

我能看到的最接近的是可选项:http: //www.python.org/dev/peps/pep-0249/#cursor-messages所以我猜它还没有实现?

t-sql sql-server pyodbc python-db-api

7
推荐指数
1
解决办法
2006
查看次数

识别sqlalchemy.exc.OperationalError

我试图捕获mysql/sqlalchemy OperationalErrors并替换句柄访问被拒绝(1045)与连接被拒绝(2003)

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user … (Background on this error at: http://sqlalche.me/e/e3q8)
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)") (Background on this error at: http://sqlalche.me/e/e3q8)
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到任何关于如何以编程方式区分这些文档的文档.我潜入了资源,并认为我可以检查err.orig.original_exception.errno的值,但事实并非如此.

编辑:似乎没有为访问被拒绝定义err.orig,这可能是一个错误.

try:
  engine.scalar(select([1]))
except sqlalchemy.exc.OperationalError as err:
  if err_______:
    print("Access Denied")
  elifif err_______:
    print("Connection Refused")
  else:
    raise
Run Code Online (Sandbox Code Playgroud)

这个问题确实让我感到烦恼,甚至连赏金都没有消息.我开始相信它必须是sqlalchemy中的一个错误,但sqlalchemy文档在这方面并不是很具描述性,而且我对sqlalchemy和python很新,所以我真的很难说.我也找不到对irc的支持,我从哪里开始?

python sqlalchemy python-db-api

7
推荐指数
1
解决办法
477
查看次数

mysql-python:无法打开和锁定权限表:表'mysql.host'不存在

我用自制软件安装了mysql.

我现在正在尝试安装mysql-python,当我运行mysql时,我不断收到以下错误.

我是编程新手,不太了解问题.

任何帮助将不胜感激.谢谢.

 TDNS-Mac-mini:~ TDNS$ easy_install mysql-python
    /Library/Frameworks/Python.framework/Versions/2.7/bin/easy_install:5: UserWarning: Module pkg_resources was already imported from /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/pkg_resources.pyc, but /Library/Python/2.7/site-packages/distribute-0.6.24-py2.7.egg is being added to sys.path
      from pkg_resources import load_entry_point
    /Library/Frameworks/Python.framework/Versions/2.7/bin/easy_install:5: UserWarning: Module site was already imported from /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.pyc, but /Library/Python/2.7/site-packages/distribute-0.6.24-py2.7.egg is being added to sys.path
      from pkg_resources import load_entry_point
    Searching for mysql-python
    Reading http://pypi.python.org/simple/mysql-python/
    Reading http://sourceforge.net/projects/mysql-python/
    Reading http://sourceforge.net/projects/mysql-python
    Best match: MySQL-python 1.2.3
    Downloading http://download.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.3.tar.gz
    Processing MySQL-python-1.2.3.tar.gz
    Running MySQL-python-1.2.3/setup.py -q bdist_egg --dist-dir /var/folders/c9/xzv35t2n3ld9lgjrtl0vd0xr0000gn/T/easy_install-LsUpDW/MySQL-python-1.2.3/egg-dist-tmp-vzGMr9
    warning: no files found matching 'MANIFEST'
    warning: no files …
Run Code Online (Sandbox Code Playgroud)

mysql-python python-db-api

6
推荐指数
1
解决办法
4253
查看次数

如何获取发送到db的准备好的查询

使用pyodbc等数据库库时实现Python数据库API规范如何在应用参数替换后获得完全准备好的查询.我正在调用一个Sybase存储过程,它将通过参数替换接收18个参数.我想捕获所做的实际调用并将其记录以帮助调试.我需要的一个更简单的例子:

pyodbc的例子

import pyodbc
conn = pyodbc.connect('DSN=test;PWD=password')
c = conn.cursor()
c.execute('CREATE TABLE stocks (symbol varchar(10), price real)')
c.execute("INSERT INTO stocks VALUES (?, ?)", ('RHAT', 35.14))
c.execute('SELECT * FROM stocks WHERE symbol=?', ('RHAT',))
print c.fetchone()
Run Code Online (Sandbox Code Playgroud)

预期的最终查询(待记录)

CREATE TABLE stocks (symbol varchar(10), price real)
INSERT INTO stocks VALUES ('RHAT', 35.14)
SELECT * FROM stocks WHERE symbol = 'RHAT'
Run Code Online (Sandbox Code Playgroud)

sqlite3的例子

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('CREATE TABLE stocks (symbol text, price real)')
c.execute("INSERT INTO stocks VALUES …
Run Code Online (Sandbox Code Playgroud)

python pyodbc python-db-api

6
推荐指数
1
解决办法
1864
查看次数

当我迭代游标时psycopg2做了什么?

我试图了解这段代码在幕后的作用:

import psycopg2

c = psycopg2.connect('db=some_db user=me').cursor()
c.execute('select * from some_table')
for row in c:
    pass
Run Code Online (Sandbox Code Playgroud)

根据PEP 249我的理解是,这是反复呼叫Cursor.next(),这相当于呼叫Cursor.fetchone().但是,psycopg2文档说如下:

执行数据库查询时,Psycopg游标通常会获取后端返回的所有记录,并将它们传输到客户端进程.

所以我很困惑 - 当我运行上面的代码时,它是将结果存储在服务器上并逐个取出它们,还是一次性带来所有内容?

python postgresql psycopg2 python-db-api

6
推荐指数
1
解决办法
2764
查看次数