Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding Naming Convention to Existing Database

I'm using sqlalchemy and am trying to integrate alembic for database migrations.

My database currently exists and has a number of ForeignKeys defined without names. I would like to add a naming convention to allow for migrations that affect ForeignKey columns.

I've added the naming convention given here to the top of my models.py file: SQLAlchemy Naming Constraints

convention = {
      "ix": 'ix_%(column_0_label)s',
      "uq": "uq_%(table_name)s_%(column_0_name)s",
      "ck": "ck_%(table_name)s_%(constraint_name)s",
      "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
      "pk": "pk_%(table_name)s"
              }

DeclarativeBase = declarative_base()


DeclarativeBase.metadata = MetaData(naming_convention=convention)

def db_connect():
   return create_engine(URL(**settings.DATABASE))

def create_reviews_table(engine):
    DeclarativeBase.metadata.create_all(engine)

class Review(DeclarativeBase):

    __tablename__ = 'reviews'

    id = Column(Integer, primary_key=True)
    review_id = Column('review_id', String, primary_key=True)
    resto_id = Column('resto_id', Integer, ForeignKey('restaurants.id'),
            nullable=True)
    url = Column('url', String),
    resto_name = Column('resto_name', String)

I've set up alembic/env.py as per the tutorial instructions, feeding my model's metadata into target_metadata.

When I run

$: alembic current

I get the following error: sqlalchemy.exc.InvalidRequestError: Naming convention including %(constraint_name)s token requires that constraint is explicitly named.

In the docs they say that "This same feature [generating names for columns using a naming convention] takes effect even if we just use the Column.unique flag:" 1, so I'm thinking that there shouldn't be a problem (they go on to give an example using a ForeignKey that isn't named too).

Do I need to go back and give all my constraints explicit names, or is there a way to do it automatically?

like image 849
ABM Avatar asked Mar 02 '14 15:03

ABM


People also ask

How do you name a database convention?

For the traditional naming convention: Database names must only consist of the letters a to z (both lower and upper case allowed), the numbers 0 to 9 , and the underscore ( _ ) or dash ( - ) symbols. This also means that any non-ASCII database names are not allowed. Database names must always start with a letter.

Do people use naming conventions in SQL programming?

Concerning tables, the percentage of naming conventions that are partially followed ranges from 7.14% to 42.8%, while the percentage of conventions that are not followed varies from 0% to 21.43%. Regarding columns, the percentage of naming conventions that are partially followed ranges from 18.75% to 37.50%.

What is naming conventions in SQL?

I've already stated it in the intro, but more generally, a naming convention is a set of rules you decide to go with before you start modeling your database. You'll apply these rules while naming anything inside the database – tables, columns, primary and foreign keys, stored procedures, functions, views, etc.

Why should you use standard naming conventions?

Why use naming conventions? Naming records consistently, logically and in a predictable way will distinguish similar records from one another at a glance, and by doing so will facilitate the storage and retrieval of records, which will enable users to browse file names more effectively and efficiently.


2 Answers

just modify th "ck" in convention to "ck": "ck_%(table_name)s_%(column_0_name)s"。it works for me .

refer to see sqlalchemy docs

like image 160
程仕成 Avatar answered Oct 18 '22 10:10

程仕成


What this error message is telling you is that you should name constraints explicitly. The constraints it's referring to are Boolean, Enum etc but not foreignkeys nor primary keys. So go through your table, wherever you have a Boolean or Enum add a name to it. For example:

is_active = Column(Boolean(name='is_active'))

That's what you need to do.

like image 36
ephraimbuddy Avatar answered Oct 18 '22 09:10

ephraimbuddy