这篇文章主要围绕使用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创建数据库)
- postgresql – Knex在Postgres中创建POINT数据类型
- postgresql – 使用GeoServer设置Postgres PostGIS数据库时遇到问题
- postgresql – 使用Heroku Postgres数据库的Aws应用程序
- postgresql – 可以在Postgres Python存储过程中使用NLTK
使用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数据类型
这是我的迁移文件的样子:
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数据库时遇到问题
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
我在设置步骤中做错了什么?
解决方法
如果没有,则可能未成功执行PostGIS的安装.
哦,如果您的主机上有多个数据库,请确保在可以访问PostGIS内容的数据库中创建表.
postgresql – 使用Heroku Postgres数据库的Aws应用程序
如果是的话,我应该考虑哪些缺点?
由于heroku是在AWS托管的,有没有办法知道运行我的数据库的机器的位置在哪里?
在数据库的同一区域托管我的应用程序有助于保持性能?
我想听听一些有关这方面的意见,我一直在搜索这个话题而没有太大的成功.
解决方法
亚马逊的RDS看起来不错,但不支持Postgresql.请继续唠叨他们.
如果性能不是特别重要,我可能只是在AWS上运行数据库.在EBS优化的实例上使用raid10预配置的IOPS EBS卷,您将获得良好的性能(但价格非常高);或者,您可以使用非崩溃安全的基于ssd的实例存储服务器,并依靠复制和备份来保证数据的安全.
postgresql – 可以在Postgres Python存储过程中使用NLTK
见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等相关知识,可以在本站进行查询。
本文标签: