我有一个存储在.sql文件中的PostgreSQL架构.它看起来像:
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
facebook_id TEXT NOT NULL,
name TEXT NOT NULL,
access_token TEXT,
created INTEGER NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
连接数据库后如何运行此模式?
我现有的Python代码适用于SQLite数据库:
# Create database connection
self.connection = sqlite3.connect("example.db")
# Run database schema
with self.connection as cursor:
cursor.executescript(open("schema.sql", "r").read())
Run Code Online (Sandbox Code Playgroud)
但是psycopg2 executescript在光标上没有方法.那么,我怎样才能做到这一点?
我正在寻找带有psycopg2二进制文件的二进制蛋用于Windows,但找不到任何.
在http://initd.org/psycopg/download/上有唯一的源包和链接到Psycopg的Windows端口,它提供二进制安装程序,但没有二进制蛋.
我正在寻找二元蛋的原因是我想在virtualenv中安装psycopg并且它不是(这个答案描述了为什么它通常是可能的),标准的Windows安装程序可以在注册表中查找已安装的Python.
旁注:我猜psycopg是一个相当受欢迎的库,它让我觉得奇怪的是不能在项目页面上提供二进制蛋.我在这里错过了什么吗?
我尝试使用这个很好的教程使用django-hstore .我在South管理的现有应用中添加了两个类:
class Attribute(models.Model):
name = models.CharField(max_length=200, verbose_name=_("name"))
description = models.CharField(max_length=1000, verbose_name=_("description"))
class Measure(models.Model):
attribute = models.ForeignKey(Attribute)
data = hstore.DictionaryField(db_index=True)
objects = hstore.HStoreManager()
Run Code Online (Sandbox Code Playgroud)
做了一个schemamigration --auto,启动了迁移并得到了一个django.db.utils.DatabaseError: type "hstore" does not exist.
好吧,tuto似乎不完整,django-hstore 文档告诉我使用自定义数据库后端,我将以下内容添加到我的设置文件中:
DATABASES['default']['ENGINE'] = 'django_hstore.postgresql_psycopg2'
Run Code Online (Sandbox Code Playgroud)
后来我有一个KeyError: 'default'在south/db/__init__.py", line 78.此时,intertubes +一些试验/错误将我指向SOUTH_DATABASE_ADAPTERS设置变量,我在设置中添加了以下内容:
SOUTH_DATABASE_ADAPTERS = {'default': 'south.db.postgresql_psycopg2'}
Run Code Online (Sandbox Code Playgroud)
新错误:
File ".../psycopg2/extras.py", line 769, in register_hstore
"hstore type not found in the database. "
psycopg2.ProgrammingError: hstore type not found in the database. …Run Code Online (Sandbox Code Playgroud) 我想将一个python字典作为json插入到我的postgresql数据库中(通过python和psycopg2).我有:
thedictionary = {'price money': '$1', 'name': 'Google', 'color': '', 'imgurl': 'http://www.google.com/images/nav_logo225.png', 'charateristics': 'No Description', 'store': 'google'}
cur.execute("INSERT INTO product(store_id, url, price, charecteristics, color, dimensions) VALUES (%d, %s, %s, %d, %s, %s)", (1, 'http://www.google.com', '$20', thedictionary, 'red', '8.5x11'))
Run Code Online (Sandbox Code Playgroud)
它给出了错误消息:
thedictionary = {'price money': '$1', 'name': 'Google', 'color': '', 'imgurl': 'http://www.google.com/images/nav_logo225.png', 'charateristics': 'No Description', 'store': 'google'}
cur.execute("INSERT INTO product(store_id, url, price, charecteristics, color, dimensions) VALUES (%d, %s, %s, %d, %s, %s)", (1, 'http://www.google.com', '$20', thedictionary, 'red', '8.5x11'))
Run Code Online (Sandbox Code Playgroud)
我不知道如何从这里开始.我在互联网上找不到关于如何做这种事情的事情,我对psycopg2很新.
我试图找出如何设置连接超时create_engine(),到目前为止我已经尝试过:
create_engine(url, timeout=10)
Run Code Online (Sandbox Code Playgroud)
TypeError:使用配置PGDialect_psycopg2/QueuePool/Engine发送到create_engine()的无效参数'timeout'.请检查关键字参数是否适合此组件组合.
create_engine(url, connection_timeout=10)
Run Code Online (Sandbox Code Playgroud)
TypeError:使用配置PGDialect_psycopg2/QueuePool/Engine发送到create_engine()的无效参数'connection_timeout'.请检查关键字参数是否适合此组件组合.
create_engine(db_url, connect_args={'timeout': 10})
Run Code Online (Sandbox Code Playgroud)
(psycopg2.OperationalError)无效的连接选项"timeout"
create_engine(db_url, connect_args={'connection_timeout': 10})
Run Code Online (Sandbox Code Playgroud)
(psycopg2.OperationalError)无效的连接选项"connection_timeout"
create_engine(url, pool_timeout=10)
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我试图从本地环境推送到Heroku主人.以前的提交没有新的要求.但是,我收到一条错误,说系统无法从"10.3"确定PostgreSQL版本.
这是我的要求清单:
amqp==1.4.9
anyjson==0.3.3
appdirs==1.4.3
awscli==1.11.89
billiard==3.3.0.23
boto==2.46.1
botocore==1.5.52
celery==3.1.25
Collectfast==0.5.2
colorama==0.3.7
dj-database-url==0.4.2
Django==1.11.1
django-celery==3.2.1
django-recaptcha==1.3.0
django-redis-cache==1.7.1
django-storages==1.5.2
django-storages-redux==1.3.2
docutils==0.13.1
gunicorn==19.7.0
honcho==0.5.0
jmespath==0.9.2
kombu==3.0.37
olefile==0.44
packaging==16.8
Pillow==4.3.0
psycopg2==2.6.2
pyasn1==0.2.3
pyparsing==2.2.0
python-dateutil==2.6.0
pytz==2018.3
PyYAML==3.12
redis==2.10.5
reportlab==3.4.0
rsa==3.4.2
s3transfer==0.1.10
selenium==3.4.0
six==1.10.0
vine==1.1.4
virtualenv==15.1.0
virtualenvwrapper-win==1.2.1
whitenoise==3.3.0
Run Code Online (Sandbox Code Playgroud)
以下是构建日志中的错误.
Collecting amqp==1.4.9 (from -r /tmp/build_28bcf3a327daae7657433628289c1501/requirements.txt (line 1))
Downloading amqp-1.4.9-py2.py3-none-any.whl (51kB)
Collecting anyjson==0.3.3 (from -r /tmp/build_28bcf3a327daae7657433628289c1501/requirements.txt (line 2))
Downloading anyjson-0.3.3.tar.gz
Collecting appdirs==1.4.3 (from -r /tmp/build_28bcf3a327daae7657433628289c1501/requirements.txt (line 3))
Downloading appdirs-1.4.3-py2.py3-none-any.whl
Collecting awscli==1.11.89 (from -r /tmp/build_28bcf3a327daae7657433628289c1501/requirements.txt (line 4))
Downloading …Run Code Online (Sandbox Code Playgroud) 我们有一个相当特殊的应用程序,它使用PostgreSQL 8.3作为存储后端(使用Python和psycopg2).我们对重要表执行的操作在大多数情况下都是插入或更新(很少删除或选择).
出于理智的原因,我们已经创建了我们自己的数据映射器层,它运行得相当好,但它有一个很大的瓶颈,即更新性能.当然,我不希望更新/替换场景像'插入空表'那样快速,但是接近它会很好.
请注意,此系统没有并发更新
我们总是在更新中设置每行的所有字段,这可以在我在测试中使用"替换"一词的术语中看到.到目前为止,我已经尝试了两种解决更新问题的方法:
创建一个replace()需要更新行数组的过程:
CREATE OR REPLACE FUNCTION replace_item(data item[]) RETURNS VOID AS $$
BEGIN
FOR i IN COALESCE(array_lower(data,1),0) .. COALESCE(array_upper(data,1),-1) LOOP
UPDATE item SET a0=data[i].a0,a1=data[i].a1,a2=data[i].a2 WHERE key=data[i].key;
END LOOP;
END;
$$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)创建一个insert_or_replace规则,以便除偶尔删除之外的所有内容都成为多行插入
CREATE RULE "insert_or_replace" AS
ON INSERT TO "item"
WHERE EXISTS(SELECT 1 FROM item WHERE key=NEW.key)
DO INSTEAD
(UPDATE item SET a0=NEW.a0,a1=NEW.a1,a2=NEW.a2 WHERE key=NEW.key);
Run Code Online (Sandbox Code Playgroud)这两者都加快了更新速度,虽然后者减慢了插入量:
Multi-row insert : 50000 items inserted in 1.32 seconds averaging 37807.84 items/s
executemany() …Run Code Online (Sandbox Code Playgroud) 我在没有ORM的情况下使用SQLAlchemy,即使用手工制作的SQL statememts直接与后端db进行交互.在这种情况下,我使用PG作为我的后端数据库(psycopg2作为数据库驱动程序) - 我不知道这是否会影响答案.
我有这样的语句(为简洁起见,假设conn是与db的有效连接):
conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)")
Run Code Online (Sandbox Code Playgroud)
还假设用户表由列组成(id [SERIAL PRIMARY KEY],name,country_id)
我怎样才能获得新用户的id(理想情况下,无需再次访问db?)
刚刚开始使用Python,我正在使用PyCharm开发一个带Django的Web应用程序.我已经安装了libpq-dev python-dev软件包,但它仍然给我带来了同样的错误:
./psycopg/psycopg.h:30:20: fatal error: Python.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
根据谷歌是没有安装python-dev软件包时出现的问题.请注意,我正在PyCharm界面中运行安装,以获得我为3.2和3.3创建的virtualenv(不确定如何从终端运行它).在virtualenv之外安装仍会引发相同的错误,即使我使用setup.py从终端安装它也是如此.如果我从终端运行pip install psycopg2,它会成功,但它会安装Python 2.7.根据他们的网站,他们支持Python 3.2.
我正在使用Python 2.7和postgresql 9.1.试图从查询中获取字典,我已经尝试了这里描述的代码:http: //wiki.postgresql.org/wiki/Using_psycopg2_with_PostgreSQL
import psycopg2
import psycopg2.extras
conn = psycopg2.connect("dbname=mydb host=localhost user=user password=password")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute ("select * from port")
type(cur.fetchall())
Run Code Online (Sandbox Code Playgroud)
它打印下一个答案:
<type 'list'>
Run Code Online (Sandbox Code Playgroud)
打印项目本身,告诉我它是列表.除外答案是字典.
编辑:
尝试下一个:
ans = cur.fetchall()[0]
print ans
print type(ans)
Run Code Online (Sandbox Code Playgroud)
回报
[288, 'T', 51, 1, 1, '192.168.39.188']
<type 'list'>
Run Code Online (Sandbox Code Playgroud) psycopg2 ×10
python ×9
postgresql ×7
django ×3
dictionary ×2
sqlalchemy ×2
binary ×1
egg ×1
git ×1
heroku ×1
hstore ×1
pycharm ×1
python-2.7 ×1
python-3.x ×1
schema ×1
sql ×1
windows ×1