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.
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.
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.
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.
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.
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)) )
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)))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With