Pandas to_sql() table not allowing me to insert new rows - python

I have code that converts a csv into an sqlalchemy table. When I try and use db.session.add() it creates an entry in the datatable, but the id is null. This stops me from being able to interact with the data. I tried creating a normal SQL alchemy table and was able to insert rows fine, but for whatever reason the way pandas added the table is preventing me from adding more rows to the table. I will attach the relevant code. Let me know if you need more
db = SQLAlchemy()
DB_NAME = "database.db"
app = Flask(__name__)
sslify = SSLify(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db.init_app(app)
class Master(db.Model):
__tablename__ = "Master"
__table_args__ = {'extend_existing':True}
index = db.Column(db.Integer, primary_key = True)
username = db.Column(db.String(150))
full_name = db.Column(db.String(150))
serial_number = db.Column(db.String(150))
asset_tag = db.Column(db.Integer)
def __repr__(self):
return '<Comments %r>' % self.id
def __init__(self, username, full_name, serial_number, asset_tag):
self.username = username
self.full_name = full_name
self.serial_number = serial_number
self.asset_tag = asset_tag
file_name = 'master.csv'
df = pd.read_csv(file_name)
df['asset_tag'].fillna('-999', inplace=True)
df['asset_tag'] = df['asset_tag'].astype('int')
df.replace(-999," ",inplace=True)
df.fillna(" ", inplace=True)
df.to_sql(con = app.config['SQLALCHEMY_DATABASE_URI'], index_label='index', name=Master.__tablename__, if_exists='append')
#app.route('/adds', methods = ['GET','POST'])
def adds():
thefullname = request.form.get('add_full')
theuser = request.form.get('add_user')
theasset = request.form.get('add_asset')
theserial = request.form.get('add_serial')
theadd = Master(username = theuser, full_name=thefullname, asset_tag=theasset, serial_number=theserial)
db.session.add(theadd)
db.session.commit()
return render_template('home.html')

Related

Fetch two columns from db using SQLalchemy

I am learning python and trying to create a drop-down in my form with the data from another table. here is my code
Models.py
class empmasterModel(db.Model):
__tablename__ = "empmaster"
Empnum = db.Column(db.Integer, primary_key=True)
Employee_Number = db.Column(db.Integer(),primary_key=True,unique = True)
Employee_Name = db.Column(db.String())
Employee_Type = db.Column(db.String())
Coreid = db.Column(db.String())
EmailId = db.Column(db.String())
def __init__(self, Employee_Number,Employee_Name,Employee_Type,Coreid,EmailId):
self.Employee_Number = Employee_Number
self.Employee_Name = Employee_Name
self.Employee_Type = Employee_Type
self.Coreid = Coreid
self.EmailId = EmailId
def __repr__(self):
return f"{self.Employee_Number}:{self.Employee_Name}:{self.Employee_Type}:{self.Coreid}:{self.EmailId}"
Above is my models.py code with class empmaster from which DB table I need the employee number and employee name.
app.py
#app.route('/component/add', methods=['GET', 'POST'])
def componentadd():
error_msg = ''
success_msg = ''
if request.method == 'GET':
empmaster_data = empmasterModel.query.all()
print(empmaster_data , "dbbbbbbbbbbbbb")
return render_template('component/add.html', empmaster_data=empmaster_data)
Above is the app.py code where I am trying to fetch data from empmaster table. But here I am getting whole table data but not two-column data. I tried two column names in brackets after the filter too but it did not work. I searched for many solutions but was not getting desired results. Can somebody help me?
If you have session management, you can do something like:
session.query(
empmasterModel.Employee_Number.label("Employee_Number"),
empmasterModel.Employee_Name.label("Employee_Name")
).all()
If you use Flask with no session management, you can get the session from the SQLAlchemy instance.
db = SQLAlchemy() # Usually in you app.py
And then:
db.session.query(
empmasterModel.Employee_Number.label("Employee_Number"),
empmasterModel.Employee_Name.label("Employee_Name")
).all()

get column names from variables sqlite python3 sqlalchemy

I want to store the details stored in x variable to the sqlite database using flask sqlalchemy. How to make it possible.
Here's the code i wrote:
from flask import Flask
from flask_httpauth import HTTPBasicAuth
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/u.db'
db = SQLAlchemy(app)
class User(db.Model) :
x = ['username = "sam"', 'password = "sam123"']
u1 = (x[0].split()[0])
p1 = (x[1].split()[0])
print(u1,p1)
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key = True)
u1 = db.Column(db.String(32), index = True)
p1 = db.Column(db.String(128))
if __name__ == '__main__':
db.create_all()
print("db created")
app.run(host='0.0.0.0', port=5001)
table created in sqlite:
id u1 p1
Required table to be created in sqlite and data to be loaded:
id username password
1 sam sam123
Your table needs to define the columns with the names that you want:
class User(db.Model) :
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key = True)
username = db.Column(db.String(32), index = True)
password = db.Column(db.String(128))
You can make function to extract the username and password from x:
def get_user_data(data):
user_data = []
for item in data:
part = item.partition(' = ')[2]
cleaned = part.replace('"', '')
user_data.append(cleaned)
return user_data
And create a User instance like this:
username, password = get_user_data(x)
user = User(username=username, password=password)

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: info

I am fresh to flask and was trying to build a server on my own, and I ran into an issue with SQLite operation error.
I did not make model.py (only running with app.py), do i have to make it?
Here's my code and Error
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os
import json
app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'crud.sqlite')
db = SQLAlchemy(app)
ma = Marshmallow(app)
class Info(db.Model):
id = db.Column(db.Integer, primary_key = True)
camId = db.Column(db.Integer, unique = False)
location = db.Column(db.String(80), unique=False)
isActive = db.Column(db.Integer, unique = False)
imgUrl = db.Column(db.String(120), unique= False)
gender = db.Column(db.String(80), unique=False)
age = db.Column(db.Integer, unique = False)
def __init__(self, camId, location, isActive, imgUrl, gender, age):
self.camId = camId
self.location = location
self.isActive = isActive
self.imgUrl = imgUrl
self.gender = gender
self.age = age
class InfoSchema(ma.Schema):
class Meta:
fields = ('camId', 'location', 'isActive', 'imgUrl', 'gender', 'age')
info_schema = InfoSchema()
info_schemas = InfoSchema(many=True)
#app.route('/')
def base():
# return (basedir)
for jsonfile in os.listdir(basedir+"/dbex/"):
if jsonfile[-4:] == "json":
with open(basedir+"/dbex/"+jsonfile) as data_result:
data = json.load(data_result)
return jsonify(data)
else:
return 'Nothing found'
#app.route('/api/create/cameraData', methods =["POST"])
def create_cameraData():
content = request.json
camId = content["camId"]
location = content["location"]
isActive = content["isActive"]
imgUrl = content["imgUrl"]
gender = content["gender"]
age = content["age"]
new_data = Info(camId, location, isActive, imgUrl, gender, age)
db.session.add(new_data)
db.session.commit()
return "success"
#app.route("/api/get/all", methods=["GET"])
def get_all_camera():
all_camera = Info.query.all()
result = info_schemas.dump(all_camera)
return jsonify(result.data)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: info [SQL: 'SELECT info.id AS info_id, info."camId" AS "info_camId", info.location AS info_location, info."isActive" AS "info_isActive", info."imgUrl" AS "info_imgUrl", info.gender AS info_gender, info.age AS info_age \nFROM info'] (Background on this error at: http://sqlalche.me/e/e3q8)

How to query with many tables

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
#import sqlite3 as sql
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://ahmad:ahmad#192.168.3.103/utama'
db = SQLAlchemy(app)
class ak(db.Model):
__tablename__ = 'ak'
id = db.Column(db.Integer, primary_key=True)
nama = db.Column(db.String)
alamat = db.Column(db.String)
akreditasi = db.Column(db.String)
def __init__(self, id, nama, alamat, akreditasi):
self.id = id
self.city = nama
self.alamat = alamat
self.akreditasi = akreditasi
class av(db.Model):
__tablename__ = 'av'
id = db.Column(db.Integer, primary_key=True)
nama = db.Column(db.String)
alamat = db.Column(db.String)
akreditasi = db.Column(db.String)
def __init__(self, id, nama, alamat, akreditasi):
self.id = id
self.city = nama
self.alamat = alamat
self.akreditasi = akreditasi
id_jurusan = db.Table('id_jurusan',
db.Column('id', db.Integer, db.ForeignKey('ak.id')),
db.Column('id', db.Integer, db.ForeignKey('av.id'))
)
#app.route('/ak')
def jurusan(jurusan):
return render_template('index.html', rows=ak.query.all() )
#app.route('/av')
def Akuntansi():
return render_template('index.html', rows=av.query.all() )
if __name__ == '__main__':
app.run(debug=True, host='1.1.1.1', port=80)
I am a new to learn python, in this case I studied the framework flask and I had trouble on the declaration SQLAlchemy, precisely displays the contents of the table but with the same structure,when executed will be like this.....
[
which one success
You are using the decorator
#app.route('/av')
The method which succeeds Akuntansi() does not require a parameter. So this works. The method which fails expects a parameter jurusan(jurusan) but your decorator #app.route('/ak') does not consider this.
To pass a parameter you need to use the decorator like this:
#app.route("/ak/<jurusan>") and then also pass the parameter in the request.

Select query fails in sqlalchemy

Please i am having this issue with my first sqlachemy app. I am trying to query the db which is posgres and return a row where it matches . Below is my code.
app.py
from sqlalchemy.orm import sessionmaker
from models.models import Base,User,Product,ProductItem,DATABASE, initialize
engine = DATABASE
Base.metadata.bind = (engine)
DBSession = sessionmaker(bind=engine)
session = DBSession()
....
#app.route('/login', methods = ['GET','POST'])
def login():
form = RegisterForm.LoginForm()
if request.method == 'GET':
return render_template('login.html', form=form)
return authenticate(form = form)
def authenticate(form):
if form.validate_on_submit():
try:
user = session.query(User).filter(User.email == 'xxxx#yahoo.com')
if session.query(exists().where(User.email == form.email.data)).scalar() :
return user.name
except :# models.DoesNotExist:
flash("Your email or password does not match !", "error")
return 'error'
my modules is in a seperate folder modules
modules/modules.py
#declarations
Base = declarative_base()
engine = create_engine('postgresql://postgres:0102443167#localhost:5432/postgres',echo=True)
Base.metadata.bind = (engine)
DBSession = sessionmaker(bind=engine)
session = DBSession()
DATABASE = engine
class User(UserMixin , Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
title = Column(CHAR(3), nullable = False)
fname = Column(String(100), nullable = False)
lname = Column(String(100), nullable = False)
username = Column(String(100), nullable = False, unique = True)
email = Column (String(50), nullable =False, unique = True)
password = Column(String(100), nullable = False)
address = Column(String(250), nullable = False)
state = Column(String(50), nullable = False)
is_Admin = Column(Boolean ,default = False)
is_Logged = Column(Boolean, default = False)
is_Active = Column (Boolean , default = False)
is_Block = Column(Boolean, default = False)
joined_On = Column(ArrowType)
......
My problem is with the app.py authenticate method. The code
user = session.query(User).filter(User.email == form.email.data)
Raise an error. When i check form.email.data return correct string. However when i tried
if session.query(exists().where(User.email == form.email.data)).scalar() :
return 'Ok'
works as expected. It works perfect and thus make me realize the issue might be with my query . I then tried
if session.query(exists().where(User.email == form.email.data)).scalar() :
return user.lname
and it raise error saying user does not have property name which should have. I am confuse. Please how do i query record from my tables ? Any help would be appreciated
You have to get the first object which matches the query so you have to add .first() at the end of the query:
user = session.query(User).filter(User.email == form.email.data).first()
See here more info.

Categories