Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a Postgres database using python

I want to create Postgres database using Python.

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

I am getting the following error:

InternalError: CREATE DATABASE cannot run inside a transaction block 

I am using psycopg2 to connect. I don't understand what's the problem. What am I trying to do is to connect to database (Postgres):

psql -postgres -U UserName 

And then create another database:

create database test; 

This is what I usually do and I want to automate this by creating Python script.

like image 436
kiran6 Avatar asked Dec 27 '15 19:12

kiran6


People also ask

How do I create a new database in PostgreSQL using Python?

Creating a database using python You can create a cursor object using the cursor() method of the Connection class. The execute() method of this class accepts a PostgreSQL query as a parameter and executes it. Therefore, to create a database in PostgreSQL, execute the CREATE DATABASE query using this method.

Can I use PostgreSQL with Python?

PostgreSQL, often written as "Postgres" and pronounced "Poss-gres", is an open source relational database implementation frequently used by Python applications as a backend for data storage and retrieval.

How do I create a schema in PostgreSQL using Python?

Steps for creating PostgreSQL tables in PythonFirst, construct CREATE TABLE statements. Next, connect to the PostgreSQL database by calling the connect() function. The connect() function returns a connection object. Then, create a cursor object by calling the cursor() method of the connection object.

Can I create a database in Python?

Creating a database in MySQL using pythonYou can connect to an existing database or, create your own. You would need special privileges to create or to delete a MySQL database. So if you have access to the root user, you can create any database.


2 Answers

Use ISOLATION_LEVEL_AUTOCOMMIT, a psycopg2 extensions:

No transaction is started when command are issued and no commit() or rollback() is required.

import psycopg2 from psycopg2 import sql from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT # <-- ADD THIS LINE  con = psycopg2.connect(dbname='postgres',       user=self.user_name, host='',       password=self.password)  con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # <-- ADD THIS LINE  cur = 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))     ) 
like image 159
Tom-db Avatar answered Sep 28 '22 11:09

Tom-db


As shown in the other answer the connection must be in autocommit mode. Another way of setting it using psycopg2 is through the autocommit attribute:

import psycopg2 from psycopg2 import sql  con = psycopg2.connect(...) con.autocommit = True  cur = con.cursor() # sql.SQL and sql.Identifier are needed to avoid SQL injection attacks. cur.execute(sql.SQL('CREATE DATABASE {};').format(     sql.Identifier(self.db_name))) 
like image 38
Álvaro Marco Avatar answered Sep 28 '22 12:09

Álvaro Marco