sqlalchemy / pymysql fails to connect to database after creating exe with pyinstaller - python

I have a python script that uses sqalchamy like this:
engine = create_engine("mysql+pymysql://" + username + ":" + password + "#" + host + "/" + database)
diffDF.to_sql('StockData', con = engine, if_exists = 'append',index = False, chunksize = 1000)
It works fine when I run the .py file but when I build an exe using pyinstaller I get this error:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'username#ipaddress' ([Errno 11003] getaddrinfo failed)")
Hidden imports:
hiddenimports=['sqlalchemy','pymysql','mysql.connector'],
Versions:
SQLAlchemy 1.4.40
PyMySQL 1.0.2
Any idea what I am missing?
Thanks

Related

NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:oracle.oracledb

When I Try to connect oracle server with SQLAlchemy. I'm getting this error.
NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:oracle.oracledb
from sqlalchemy.engine import create_engine
DIALECT = 'oracle'
SQL_DRIVER = 'oracledb'
USERNAME = 'username' #enter your username
PASSWORD = 'password' #enter your password
HOST = 'host url' #enter the oracle db host url
PORT = 1533 # enter the oracle port number
SERVICE = 'service name' # enter the oracle db service name
ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'#' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE
engine = create_engine(ENGINE_PATH_WIN_AUTH)
#test query
import pandas as pd
test_df = pd.read_sql_query('SELECT * FROM global_name', engine)
any different method to connect?
For completeness (since the answer is already in comments): with SQLAlchemy 1.4 add this to your top level script file:
import sys
import oracledb
oracledb.version = "8.3.0"
sys.modules["cx_Oracle"] = oracledb
and then proceed as if you were using cx_Oracle. The create_engine() should begin with oracle: like:
# SQLAlchemy 1.4 with python-oracledb or cx_Oracle
engine = create_engine('oracle://...
The sys.modules etc snippet isn't needed for SQLAlchemy 2.0. With this version create_engine() should begin with oracle+oracledb: like:
# SQLAlchemy 2.0 with python-oracledb
engine = create_engine('oracle+oracledb://...
These posts are good references:
Using python-oracledb 1.0 with SQLAlchemy, Pandas, Django and Flask
Using SQLAlchemy 2.0 (development) with python-oracledb for Oracle Database

Oracle connect from Databricks

I am trying to connect to Oracle database in an on-premises VM from Databricks.
I tried to connect using CX_Oracle via Python through init-script by following this link. It failed with below errors
Then I tried to connect using Pyspark and it also failed with below error. Also installed OJDBC into the cluster, where I used OJDBC version compatible with Oracle DB version.
URL = "jdbc:oracle:thin:" + User_Name + "/" + Password + "#//" + IP + ":" + Port + "/" + DB_name
DbTable = DataBase_name + "." + Table_Name
empDF = spark.read.format("jdbc").option("url", URL).option("dbtable", DbTable).option("user", User_Name).option("password", Password).option("driver", "oracle.jdbc.driver.OracleDriver").load()
Using the same settings in ADF Lookup activity, using a self hosted IR I am able to establish the connection. Is there anything I am missing in the connection string from Databricks?

Getting ValueError: character U+380031 is not in range [U+0000; U+10ffff] when attempting connection to teradata using sqlalchemy in flask web app

I am getting the ValueError: character U+380031 is not in range [U+0000; U+10ffff] when attempting to make a connection to teradata using sqlalchemy inside a flask web app.
from sqlalchemy import create_engine
user = 'user_string'
pasw='password_string'
host = 'host_string'
td_engine = create_engine('teradata://'+ user +':' + pasw + '#'+ host + '/' + '?authentication=LDAP&driver=Teradata Database ODBC Driver 16.20')
sql = 'select * from dbc.usersV'
result = td_engine.execute(sql)
I have been able to make a successful connection using pyodbc, however, I really would like to use sqlalchemy to accomplish this.
The expected result is of course a successful teradata connection and the ability to return the result of 'select * from dbc.usersV'. However, I continue to get the ValueError: character U+380031 is not in range [U+0000; U+10ffff]. Thanks for the help in advance.

Connect to db2 database with Python

I'm working on an app that needs to connect to an ibm db2 database. Using DBeaver I can successfully connect to the database (I provide him the db2cc.jar and db2cc4.jar files).
It looks to me as DBeaver is using my Window's credentials to login, because I didn't need to input any login or password to connect.
Now, I've been trying to connect to the same database using python 3.7 and pypi's latest version of the ibm_db package. I didn't install anything else.
import ibm_db
# ...
connection_string = "DATABASE=" + self.params['schema'] + ";" + \
"HOSTNAME=" + self.params['host'] + ";" + \
"PORT=" + self.params['port'] + ";" + \
"PROTOCOL=TCPIP;" + \
"SECURITYMECHANISM=4;" + \
"UID=" + self.params['user'] + ";" + \
"PWD=" + self.params['password'] + ";"
try:
self.connection = ibm_db.connect(connection_string, "", "")
# ...
Using my Windows credentials in the parameters, I get the following error message:
Connection error
Bad credentials
SQLCODE=-30082
08001
From what I've seen on stack overflow connecting to a db2 database is complicated...
Does someone know how to connect ? Using the windows credentials or otherwise...
Thanks !
Db2 works fine with Python.
You need to be aware of some basics before you start such as:
what operating-system runs the target Db2-database and
what kind of client is being used (java, odbc/cli, .net etc), and
what kind of authentication/encrpytion is in place for the database
(ssl, server based authentication/+/-/encryption etc.).
is the remote database rdbms Apache DERBY or Db2.
Find out these basics before you start. You have to speak with people who run the Db2-server.
Note: in your question you mention (SecurityMechanism=4) com.ibm.db2.jcc.DB2BaseDataSource.USER_ONLY_SECURITY - this is not relevant for non-JAVA clients, it is relevant is the database manager is DERBY .
For python, the ibm_db package is not a java application.
DBeaver is a java application (hence it uses db2jcc.jar or db2jcc4.jar and a licence-file to connect to the remote database).
You can only use your Windows credentials for connecting to a Db2-database when that Db2-database run on Microsoft-Windows, and the credentials work on the hostname running the Db2-server. For any other combinations, the administrator must issue you a userid/password that is relevant for the target hostname.
The ibm_db package needs a Db2-client to be installed. The Db2-client is a separate installable. There are different kinds of Db2-client depending both on which operating-system runs your Db2-server and how much functionality you need to have in your Db2-client. If your remote Db2-server runs on Linux, Unix, Windows or Z/OS then you can use the "IBM Data Server Runtime Client" which you can either download from IBM's passport advantage website, or get from your internal IT folks. If your Db2-server runs on i-Series (AS/400) you should get its drivers from your i-Series administrator. For either Z/OS or i-Series you will additionally need a license file (which costs money) and you should get that from your administrator, unless your company uses a gateway product called Db2-connect in which case you don't need a separate license file on your workstation.
Try the following connection string, If your db2 client and server are on the same host.
Change the 'mydb' and 'DB2' (db2 instance name, you can get it with db2ilist utility) constants according your case.
ibm_db.connect('DATABASE=mydb;Instance=DB2;PROTOCOL=IPC;', '', '')
add ibm_db library and import ibm_db on top in the .py file.
def get_db_connection():
"""
This will help to get db2 connection for query execution
:return: conn
"""
dsn_driver = "{IBM DB2 ODBC DRIVER}"
dsn_database = "BLUDB"
dsn_hostname = "your_hostname"
dsn_port = "50000"
dsn_protocol = "TCPIP"
dsn_uid = "your_userid"
dsn_pwd = "your_pwd"
dsn = (
"DRIVER={0};"
"DATABASE={1};"
"HOSTNAME={2};"
"PORT={3};"
"PROTOCOL={4};"
"UID={5};"
"PWD={6};").format(dsn_driver, dsn_database, dsn_hostname, dsn_port, dsn_protocol, dsn_uid, dsn_pwd)
try:
conn = ibm_db.connect(dsn, "", "")
print("Connected!")
return conn
except Exception:
print("\nERROR: Unable to connect to the \'" + dsn_database + "\' server.")
print("error: ", ibm_db.conn_errormsg())
exit(-1)
function get_db_connection() will return the connection object. On that connection object you can perform operation like:
conn = get_db_connection()
list_results = []
select_query = 'SELECT a.STATUS, a.ID FROM "TABLE_NAME" AS a'
print(select_query)
selectStmt = ibm_db.exec_immediate(conn, select_query)
while ibm_db.fetch_row(selectStmt) != False:
list_results.append(ibm_db.result(selectStmt, 'ID'))
ibm_db.close(conn)

Connecting to Azure SQL Server with AAD authentication using PyODBC

Environment:
Docker image: python:2.7.14-stretch (which means Debian 9 as underlying OS)
Installed SQL Server ODBC driver for Debian 9 (https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017)
using pyodbc module
Connecting to Azure SQL Server with AAD authentication.
Issue:
First connection to DB is made perfectly fine. However any next connection to same DB or other DB is failed with below error:
Exception::: ('08001', u'[08001] [unixODBC][Microsoft][ODBC Driver 17
for SQL Server]SSL Provider:
[error:140A90F1:lib(20):func(169):reason(241)] (-1)
(SQLDriverConnect)')
Cannot connect to DB
Please note that this is issue with only when using AAD autnethcation mode. If I use simple sql server user, everything runs fine.
Below is the example code snippet.
db_list = [TEST_DB1, TEST_DB2]
sql_conn = None
for db in db_list:
try:
conn_string = 'DRIVER={ODBC Driver 17 for SQL Server};' \
'SERVER=' + <db_url> + \
';DATABASE=' + <db_name> + \
';UID=' + <db_username> + \
';PWD=' + <db_password> + \
';Authentication=ActiveDirectoryPassword'
print conn_string
sql_conn = pyodbc.connect(conn_string)
except Exception as e:
print "Exception:::", e
print 'Cannot connect to DB' + str(sys.exc_info()[0])
return None
sql_conn.cursor().execute(<some SQL Query>)
sql_conn.close()

Categories

Resources