GVKun编程网logo

使用python创建Postgres数据库(如何用python创建数据库)

20

这篇文章主要围绕使用python创建Postgres数据库和如何用python创建数据库展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用python创建Postgres数据库的优缺点,解答如何

这篇文章主要围绕使用python创建Postgres数据库如何用python创建数据库展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用python创建Postgres数据库的优缺点,解答如何用python创建数据库的相关问题,同时也会为您带来postgresql – Knex在Postgres中创建POINT数据类型、postgresql – 使用GeoServer设置Postgres PostGIS数据库时遇到问题、postgresql – 使用Heroku Postgres数据库的Aws应用程序、postgresql – 可以在Postgres Python存储过程中使用NLTK的实用方法。

本文目录一览:

使用python创建Postgres数据库(如何用python创建数据库)

使用python创建Postgres数据库(如何用python创建数据库)

我想使用Python创建Postgres数据库。

con = psql.connect(dbname=''postgres'',      user=self.user_name, host='''',      password=self.password)cur = con.cursor()cur.execute("CREATE DATABASE %s  ;" % self.db_name)

我收到以下错误:

InternalError: CREATE DATABASE cannot run inside a transaction block

我正在使用psycopg2进行连接。我不明白这是什么问题。我想做的是连接到数据库(Postgres):

psql -postgres -U UserName

然后创建另一个数据库:

create database test;

这是我通常要做的,我想通过创建Python脚本来实现此自动化。

答案1

小编典典

使用psycopg2扩展名ISOLATION_LEVEL_AUTOCOMMIT:

发出命令且不需要commit()或rollback()时,不会启动任何事务。

import psycopg2from psycopg2 import sqlfrom psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT # <-- ADD THIS LINEcon = psycopg2.connect(dbname=''postgres'',      user=self.user_name, host='''',      password=self.password)con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # <-- ADD THIS LINEcur = con.cursor()# Use the psycopg2.sql module instead of string concatenation # in order to avoid sql injection attacs.cur.execute(sql.SQL("CREATE DATABASE {}").format(        sql.Identifier(self.db_name))    )

postgresql – Knex在Postgres中创建POINT数据类型

postgresql – Knex在Postgres中创建POINT数据类型

我正在尝试使用POINT数据类型&创建一个模式. knex似乎没有在DB中创建它.然而,它正在创建所有其他领域.

这是我的迁移文件的样子:

exports.up = (knex,Promise) => {
  return Promise.all([
    knex.schema.createTableIfNotExists(''users'',(table) => {
      table.uuid(''id'').primary()
      table.string(''username'',35)
      table.text(''pword'').notNullable()
      table.string(''first_name'',55)
      table.string(''last_name'',55)
      knex.schema.raw(''coordinates POINT DEFAULT POINT (37.3875,-122.0575)'')
      table.timestamp(''date_created'').defaultTo(knex.fn.Now())
    })
  ])
}

exports.down = (knex,Promise) => {
  return Promise.all([
    knex.schema.dropTableIfExists(''users'')
  ])
}

这是失败的代码行:

knex.schema.raw(''coordinates POINT DEFAULT POINT (37.3875,-122.0575)'')

我也尝试删除schema属性:

knex.raw(''coordinates POINT DEFAULT POINT (37.3875,-122.0575)'')

没有打印出错误,它似乎无声地失败.

编辑1:

我用以下方法打印出来:knex.schema.raw(‘坐标POINT DEFAULT POINT(37.3875,-122.0575)’).然后(data => console.log(data)).catch(error => console.log(错误))

{ error: coordinates POINT DEFAULT POINT (37.3875,-122.0575) - Syntax error at or near "coordinates"
    at Connection.parseE (/Users/james/plural/backend-development/node_modules/pg/lib/connection.js:554:11)
    at Connection.parseMessage (/Users/james/plural/backend-development/node_modules/pg/lib/connection.js:381:17)
    at Socket.<anonymous> (/Users/james/plural/backend-development/node_modules/pg/lib/connection.js:117:22)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:172:18)
    at Socket.Readable.push (_stream_readable.js:130:10)
    at TCP.onread (net.js:542:20)
  name: ''error'',length: 92,severity: ''ERROR'',code: ''42601'',detail: undefined,hint: undefined,position: ''1'',internalPosition: undefined,internalQuery: undefined,where: undefined,schema: undefined,table: undefined,column: undefined,dataType: undefined,constraint: undefined,file: ''scan.l'',line: ''1081'',routine: ''scanner_yyerror'' }

解决方法

试试这个:

table.specificType(‘coordinates’,’POINT’).defaultTo(knex.raw(‘POINT(37.3875,-122.0575)’))

对于Knex未涵盖的sql类型,您始终可以使用以下格式:

table.specificType(‘column_name’,’TYPE’)

postgresql – 使用GeoServer设置Postgres PostGIS数据库时遇到问题

postgresql – 使用GeoServer设置Postgres PostGIS数据库时遇到问题

我在Postgres数据库中创建了一个表,其中包含名称image_id和geometry列.这是架构的样子:

CREATE TABLE images
(
  "name" character varying(256) NOT NULL,image_id integer NOT NULL,srid integer NOT NULL DEFAULT 4326,images_geom geometry,CONSTRAINT images_pkey PRIMARY KEY (name),CONSTRAINT enforce_dims_images_geom CHECK (st_ndims(images_geom) = 2),CONSTRAINT enforce_srid_images_geom CHECK (st_srid(images_geom) = 4326)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE images OWNER TO postgres;
ALTER TABLE images ALTER COLUMN images_geom SET STATISTICS 4326;

我使用此sql语句将测试记录插入表中:

insert into images (name,image_id,srid,images_geom) values (''image1.png'',1,4326,ST_GeomFromText(''point(21.12312 -125.01010)'',4326));

然后在GeoServer中我创建了一个新的PostGIS商店并将其连接到我在Postgres中创建的数据库.当我尝试创建一个新层并将其与新商店连接时,我创建了它错误并显示以下错误消息:

java.lang.RuntimeException: Error occurred while building the resources for the configuration page
    at org.geoserver.web.data.layer.NewLayerPage.buildLayerInfo(NewLayerPage.java:202)
    at org.geoserver.web.data.layer.NewLayerPage$3.onClick(NewLayerPage.java:173)
    at org.geoserver.web.wicket.SimpleAjaxLink$1.onClick(SimpleAjaxLink.java:44)
    at org.apache.wicket.ajax.markup.html.AjaxLink$1.onEvent(AjaxLink.java:65)
    at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:163)
    at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:297)
    at org.apache.wicket.request.target.component.listener.BehaviorRequestTarget.processEvents(BehaviorRequestTarget.java:104)
    at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91)
    at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1239)
    at org.apache.wicket.RequestCycle.step(RequestCycle.java:1316)
    at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1418)
    at org.apache.wicket.RequestCycle.request(RequestCycle.java:532)
    at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:356)
    at org.apache.wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:124)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.springframework.web.servlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:158)
    at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
    at org.springframework.web.servlet.dispatcherServlet.dodispatch(dispatcherServlet.java:875)
    at org.springframework.web.servlet.dispatcherServlet.doService(dispatcherServlet.java:809)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
    at org.geoserver.filters.ThreadLocalsCleanupFilter.doFilter(ThreadLocalsCleanupFilter.java:23)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at org.vfny.geoserver.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
    at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
    at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:124)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.ui.logout.logoutFilter.doFilter(logoutFilter.java:110)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
    at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at org.geoserver.filters.LoggingFilter.doFilter(LoggingFilter.java:73)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at org.geoserver.filters.ReverseProxyFilter.doFilter(ReverseProxyFilter.java:183)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at org.geoserver.filters.GZIPFilter.doFilter(GZIPFilter.java:41)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.httpconnection.handleRequest(httpconnection.java:505)
    at org.mortbay.jetty.httpconnection$RequestHandler.headerComplete(httpconnection.java:828)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.httpconnection.handle(httpconnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)
Caused by: java.io.IOException
    at org.geotools.jdbc.JDBCFeatureSource.buildFeatureType(JDBCFeatureSource.java:340)
    at org.geotools.jdbc.JDBCDataStore.createFeatureSource(JDBCDataStore.java:712)
    at org.geotools.data.store.ContentDataStore.getFeatureSource(ContentDataStore.java:383)
    at org.geotools.data.store.ContentDataStore.getFeatureSource(ContentDataStore.java:348)
    at org.geotools.data.store.ContentDataStore.getFeatureSource(ContentDataStore.java:647)
    at org.geoserver.catalog.CatalogBuilder.buildFeatureType(CatalogBuilder.java:324)
    at org.geoserver.web.data.layer.NewLayerPage.buildLayerInfo(NewLayerPage.java:198)
    ... 73 more
Caused by: org.postgresql.util.PsqlException: ERROR: relation "geometry_columns" does not exist
  Position: 18
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:252)
    at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
    at org.geotools.data.postgis.PostGISDialect.getMapping(PostGISDialect.java:225)
    at org.geotools.jdbc.JDBCFeatureSource.buildFeatureType(JDBCFeatureSource.java:258)
    ... 79 more

我在设置步骤中做错了什么?

解决方法

检查是否有一个名为geometry_columns的表.

如果没有,则可能未成功执行PostGIS的安装.

哦,如果您的主机上有多个数据库,请确保在可以访问PostGIS内容的数据库中创建表.

postgresql – 使用Heroku Postgres数据库的Aws应用程序

postgresql – 使用Heroku Postgres数据库的Aws应用程序

是否有可能在aws EC2上运行一个应用程序并让它的数据库在heroku的postgres上运行?
如果是的话,我应该考虑哪些缺点?
由于heroku是在AWS托管的,有没有办法知道运行我的数据库的机器的位置在哪里?
在数据库的同一区域托管我的应用程序有助于保持性能?
我想听听一些有关这方面的意见,我一直在搜索这个话题而没有太大的成功.

解决方法

您可以使用traceroute在任何给定时间确定Heroku数据库的面向公众的位置…但不保证它将保留在该位置,或者没有任何内部重新路由.您可能希望直接与Heroku支持人员讨论如何确保您的Heroku数据库实例是您的AWS应用程序实例的本地实例,因为这肯定会使性能受益.查看您是否可以找到可用区域,或者至少在哪个主要区域中运行数据库,以及是否可以将数据库实例“固定”到给定区域/区域.

亚马逊的RDS看起来不错,但不支持Postgresql.请继续唠叨他们.

如果性能不是特别重要,我可能只是在AWS上运行数据库.在EBS优化的实例上使用raid10预配置的IOPS EBS卷,您将获得良好的性能(但价格非常高);或者,您可以使用非崩溃安全的基于ssd的实例存储服务器,并依靠复制和备份来保证数据的安全.

postgresql – 可以在Postgres Python存储过程中使用NLTK

postgresql – 可以在Postgres Python存储过程中使用NLTK

如果可以在Postgres Python存储过程或触发器中使用NLTK,是否有人完成甚至没有
您可以在PL / Python存储过程或触发器中使用几乎任何Python库.

见PL/Python documentation.

概念

要理解的关键点是PL / Python是cpython(无论如何都在Postgresql中包括9.3);它使用与普通独立Python完全相同的解释器,它只是将它作为库加载到Postgresql支持的.有一些限制(如下所述),如果它适用于cpython,它可以与PL / Python一起使用.

如果您的系统上安装了多个Python解释器 – 版本,发行版,32位与64位等 – 您可能需要确保在运行distutils脚本等时将扩展和库安装到正确的解释器中,但这是关于它.

由于您可以加载任何可用于系统Python的库,因此没有理由认为NLTK会成为一个问题,除非您知道它需要在Postgresql后端中不真正推荐的线程之类的东西. (果然,我尝试了它并且它“正常工作”,见下文).

一个可能的问题是像NLTK这样的东西的启动开销可能很大,你可能想要在postmaster中预加载PL / Python并在你的设置代码中导入模块,以便在后端启动时准备就绪.理解postmaster是所有其他后端fork()的父进程,所以如果postmaster预加载了后端可用的东西,大大减少了开销.无论如何测试性能.

安全

因为您可以通过PL / Python加载任意C库,并且因为Python解释器没有真正的安全模型,所以plpythonu是一种“不受信任”的语言.作为postgres用户,脚本可以完全和不受限制地访问系统,并且可以简单地绕过Postgresql中的访问控制.出于明显的安全原因,这意味着PL / Python函数和触发器可能只能由超级用户创建,尽管GRANT普通用户能够运行由超级用户安装的精心编写的函数是非常合理的.

好处是你可以在普通的Python中做很多事情,记住Python解释器的生命周期是数据库连接(会话)的生命周期.不建议使用线程,但大多数其他事情都没问题.

PL / Python函数必须使用仔细的输入卫生编写,必须在调用SPI以运行查询时设置search_path等.本手册中将对此进行更多讨论.

限制

长时间运行或可能存在问题的事情,如DNS查找,到远程系统的HTTP连接,SMTP邮件传递等,通常应该使用LISTEN和NOTIFY而不是后端作业从助手脚本完成,以保持Postgresql的性能并避免妨碍VACUUM有很多长期交易.你可以在后端做这些事情,这不是一个好主意.

您应该避免在Postgresql后端中创建线程.

不要尝试加载任何将加载libpq C库的Python库.这可能会导致后端出现各种令人兴奋的问题.当从PL / Python与Postgresql交谈时,使用SPI例程而不是常规客户端库.

不要在后端做很长时间的事情,否则会造成真空问题.

不要加载任何可能加载已加载的本机C库的不同版本的东西 – 例如不同的libcrypto,libssl等.

永远不要直接写入Postgresql数据目录中的文件.

PL / Python函数作为操作系统上的postgres系统用户运行,因此他们无法访问用户主目录或连接客户端文件等内容.

测试结果

$yum install python-nltk python-nltk
$psql -U postgres regress

regress=# CREATE LANGUAGE plpythonu;

regress=# CREATE OR REPLACE FUNCTION nltk_word_tokenize(word text) RETURNS text[] AS $$
          import nltk
          return nltk.word_tokenize(word)
          $$LANGUAGE plpythonu;

regress=# SELECT nltk_word_tokenize('This is a test,it''s going to work fine');
              nltk_word_tokenize               
-----------------------------------------------
 {This,is,a,test,",it,'s,going,to,work,fine}
(1 row)

所以,正如我所说:试试吧.只要Python解释器Postgresql用于plpython安装了nltk的依赖项,它就能正常工作.

注意

PL / Python是cpython,但我很想看到一个基于PyPy的替代品,可以使用PyPy的沙箱功能运行不受信任的代码.

今天关于使用python创建Postgres数据库如何用python创建数据库的分享就到这里,希望大家有所收获,若想了解更多关于postgresql – Knex在Postgres中创建POINT数据类型、postgresql – 使用GeoServer设置Postgres PostGIS数据库时遇到问题、postgresql – 使用Heroku Postgres数据库的Aws应用程序、postgresql – 可以在Postgres Python存储过程中使用NLTK等相关知识,可以在本站进行查询。

本文标签: